Files
b17314andClaude Opus 4.8 33115402bb GUI 도 dsm.config.ini 자동 로드
- 대상 폴더(→ exe 폴더)에 dsm.config.ini 가 있으면 자동으로 읽어 화면 옵션에 반영
  (폴더 선택 시 / 생성 시 자동 탐색, 이미 적용한 파일은 재로드 안 함)
- [설정(ini) 불러오기…] 버튼으로 임의 경로의 ini 선택 가능
- ini 의 samplemarker 등 UI 에 없는 값도 실행에 반영

이전엔 GUI 가 ini 를 무시해 기본값(엔진 미제외)으로 동작 → 엔진이 포함되던 문제 해결

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 12:46:24 +09:00
..

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 = 비순환 = 빌드 순서). 동일 파일명이 여러 개면 상대경로로 자동 구분한다.

루트 밖 참조도 분석(중요): 선택한 폴더 밖에 있는 프로젝트/DLL도 포함한다.

  • follow(기본 ON): 루트 밖 ProjectReference 를 전이적으로 따라가 그 프로젝트(및 그 의존)까지 노드로 포함.
  • externaldll(기본 ON): HintPath 로 참조하는 외부 DLL 을 (외부 DLL) 노드로 포함.
  • 그룹/노드명 기준은 포함된 모든 파일의 공통 상위 폴더로 자동 설정(예: 여러 폴더에 걸치면 Common/Product/(외부 DLL) 등으로 분리).

사용법 (GUI)

  1. DsmTool.exe 실행 → 대상 폴더 선택(필요 시 출력 폴더).
  2. 옵션: Sample 제외 · 내부 NuGet 자동감지 · 루트 밖 프로젝트 따라가기 · 외부 DLL 포함 · 그룹 모드. 고급 설정 에서 제외 경로·수동 패키지 매핑 조정.
  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.

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 경로 우회 포함)