# DsmTool — 의존성 매트릭스 생성기 (범용 단일 exe)

임의의 `.NET/C++` 저장소를 스캔해 **프로젝트 의존성 매트릭스(DSM)** 를 `HTML + CSV` 로 만드는 GUI/CLI 도구.
**NativeAOT 단일 exe(완전 무설치·약 31MB)** 로 배포된다. 여러 팀의 저장소에 **설정만 바꿔** 재사용할 수 있다.

## 배포물
- **`..\DsmTool.exe`** — 이것 하나만 복사하면 실행. .NET 설치/웹뷰 불필요.
  (Avalonia 네이티브 렌더 DLL 3종은 exe 안에 임베드 → 최초 실행 시 `%TEMP%\DsmTool_native` 로 자체 추출)

## 동작 원리 (범용)
각 `*.csproj / *.vcxproj` 에서 **내부 → 내부** 의존만 추출한다:
1. **ProjectReference** → 대상 프로젝트로 간선
2. **`<Reference>`(HintPath)** → 어셈블리명이 스캔된 프로젝트명과 일치하면 간선
3. **PackageReference** → **자동 감지**: id 가 스캔된 프로젝트명 또는 `<PackageId>` 와 일치하면 내부 간선
   (버전 접미사 등으로 모호하면 링크 생략 → 필요 시 `map=` 로 수동 보정)

노드는 위상 정렬(공급자 먼저)되며, 순환이 없으면 하삼각 행렬이 된다(상삼각 위반 0 = 비순환 = 빌드 순서).
동일 파일명이 여러 개면 상대경로로 자동 구분한다.

## 사용법 (GUI)
1. `DsmTool.exe` 실행 → **대상 폴더** 선택(필요 시 **출력 폴더**).
2. 옵션: *Sample 제외*, *내부 NuGet 자동 감지*, **그룹 모드**(auto/topfolder/prefix/none).
   *고급 설정* 에서 제외 경로·수동 패키지 매핑 조정.
3. **생성** → `{분석폴더명}_DependencyMetrix.html`, `{분석폴더명}_DependencyMetrix.csv`
   (예: `D:\ZOO` 분석 시 `ZOO_DependencyMetrix.html`).
4. **HTML 브라우저로 열기**(내장 웹뷰 없음 — 기본 브라우저).

## 사용법 (CLI)
```
DsmTool.exe --cli <대상폴더> [출력폴더] [--config <ini경로>]
```
요약은 `<출력폴더>\_cli_result.txt` 에도 기록(자동화/CI 용).

## 팀별 설정 — `dsm.config.ini` (재빌드 불필요)
대상 폴더(또는 exe 폴더)에 `dsm.config.ini` 를 두면 자동 적용된다. 예시는 [dsm.config.sample.ini](dsm.config.sample.ini).
```ini
exclude = \source\engine\      ; 거대 서브트리를 블랙박스로 제외(반복 가능, 기본에 추가)
excludeSamples = true
internal = auto                ; 내부 NuGet 자동 감지 (none 으로 끄기)
group = auto                   ; auto | topfolder | prefix | none
map = MyPkg_1.2 = MyProject    ; 버전 모호 패키지 수동 매핑(선택)
```
기본 제외(빌드 산출물): `\bin\ \obj\ \.vs\ \.git\ _wpftmp \packages\ \node_modules\ \testresults\ \_backup\ \.old\`

## 검증된 예 (기준값)
| 대상 | 설정 | 결과 |
|------|------|------|
| `D:\ZOO` | `zoo.dsm.config.ini`(engine/oda/bcg 제외) | 68 노드 · 80 간선 · 순환 0 |
| `E:\hanmac\EG-BIM_Modeler` | 기본값(그룹 auto→prefix) | 244 노드 · 600 간선 · 순환 0 |

> 참고: ZOO 의 `TeighaCodePack_22.12_16/_23.1_16` 처럼 **버전 접미사 내부 패키지**는 자동 매칭이 모호해 생략된다. 정확히 잇고 싶으면 `dsm.config.ini` 에 `map=` 로 지정.

## 다시 빌드
> ⚠ NativeAOT 링커는 **한글/비ASCII 경로에서 실패**한다. 아래 스크립트가 소스를 ASCII 임시경로로 복사해 빌드 후 exe만 회수한다.
```
build-single-exe.bat
```
요구: .NET 8/9 SDK + Visual Studio 2022 **“C++ 데스크톱 개발”** 워크로드. (실행 자체는 한글 경로 무관)

## 구성 파일
| 파일 | 역할 |
|------|------|
| `Program.cs` | 진입점 · CLI · 설정 자동탐색 · 네이티브 DLL 자체추출 |
| `DsmEngine.cs` | 핵심(파싱→DSM→HTML/CSV) · `DsmConfig`(설정/ini 로더) |
| `MainWindow.axaml(.cs)` / `App.axaml(.cs)` | GUI (Avalonia) |
| `native\*.dll` | 임베드용 Avalonia 네이티브 렌더 DLL |
| `dsm.config.sample.ini` | 설정 예시 |
| `build-single-exe.bat` | 단일 exe 빌드(ASCII 경로 우회 포함) |
