- 대상 폴더(→ exe 폴더)에 dsm.config.ini 가 있으면 자동으로 읽어 화면 옵션에 반영 (폴더 선택 시 / 생성 시 자동 탐색, 이미 적용한 파일은 재로드 안 함) - [설정(ini) 불러오기…] 버튼으로 임의 경로의 ini 선택 가능 - ini 의 samplemarker 등 UI 에 없는 값도 실행에 반영 이전엔 GUI 가 ini 를 무시해 기본값(엔진 미제외)으로 동작 → 엔진이 포함되던 문제 해결 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DsmTool — 의존성 매트릭스 생성기 (범용 단일 exe)
임의의 .NET/C++ 저장소를 스캔해 프로젝트 의존성 매트릭스(DSM) 를 HTML + CSV 로 만드는 GUI/CLI 도구.
NativeAOT 단일 exe(완전 무설치·약 31MB) 로 배포된다. 여러 팀의 저장소에 설정만 바꿔 재사용할 수 있다.
배포물
..\DsmTool.exe— 이것 하나만 복사하면 실행. .NET 설치/웹뷰 불필요. (Avalonia 네이티브 렌더 DLL 3종은 exe 안에 임베드 → 최초 실행 시%TEMP%\DsmTool_native로 자체 추출)
동작 원리 (범용)
각 *.csproj / *.vcxproj 에서 내부 → 내부 의존만 추출한다:
- ProjectReference → 대상 프로젝트로 간선
<Reference>(HintPath) → 어셈블리명이 스캔된 프로젝트명과 일치하면 간선- PackageReference → 자동 감지: id 가 스캔된 프로젝트명 또는
<PackageId>와 일치하면 내부 간선 (버전 접미사 등으로 모호하면 링크 생략 → 필요 시map=로 수동 보정)
노드는 위상 정렬(공급자 먼저)되며, 순환이 없으면 하삼각 행렬이 된다(상삼각 위반 0 = 비순환 = 빌드 순서). 동일 파일명이 여러 개면 상대경로로 자동 구분한다.
루트 밖 참조도 분석(중요): 선택한 폴더 밖에 있는 프로젝트/DLL도 포함한다.
follow(기본 ON): 루트 밖 ProjectReference 를 전이적으로 따라가 그 프로젝트(및 그 의존)까지 노드로 포함.externaldll(기본 ON):HintPath로 참조하는 외부 DLL 을(외부 DLL)노드로 포함.- 그룹/노드명 기준은 포함된 모든 파일의 공통 상위 폴더로 자동 설정(예: 여러 폴더에 걸치면
Common/Product/(외부 DLL)등으로 분리).
사용법 (GUI)
DsmTool.exe실행 → 대상 폴더 선택(필요 시 출력 폴더).- 옵션: Sample 제외 · 내부 NuGet 자동감지 · 루트 밖 프로젝트 따라가기 · 외부 DLL 포함 · 그룹 모드. 고급 설정 에서 제외 경로·수동 패키지 매핑 조정.
- 생성 →
{분석폴더명}_DependencyMetrix.html,{분석폴더명}_DependencyMetrix.csv(예:D:\ZOO분석 시ZOO_DependencyMetrix.html). - HTML 브라우저로 열기(내장 웹뷰 없음 — 기본 브라우저).
사용법 (CLI)
DsmTool.exe --cli <대상폴더> [출력폴더] [--config <ini경로>]
요약은 <출력폴더>\_cli_result.txt 에도 기록(자동화/CI 용).
팀별 설정 — dsm.config.ini (재빌드 불필요)
대상 폴더(또는 exe 폴더)에 dsm.config.ini 를 두면 자동 적용된다. 예시는 dsm.config.sample.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 경로 우회 포함) |