Files
networkSetup/docs/changes/2026-11-10-exe-target-roots.md
T
jychoi4andClaude Opus 5.5 366c8fe173 feat: add EXE projects with versioned install configuration
- EXE project kind next to MSIX: formats.exe, new EXE projects, EXE app
  info (architecture, UpgradeCode), per-kind workspace; EXE builds and
  signing are still refused explicitly (#9).
- Install configuration tabs: registry grid, shortcuts and installer
  properties with formatted-text checks (#10).
- Per-version .isver files: version list, add dialog, lock/unlock,
  delete with .isver.bak backups, description (#11).
- Major/patch versions with cumulative patch checks and automatic kind
  selection (#12).
- 설치화면 tab: setup steps, theme and scripts per version (#13).
- Preferences: theme and display language (#14).
- 설치파일 tab as an Explorer-style tree: per-row add/remove, Windows
  folder install locations (FileRule.targetRoot), picked files placed
  with FileRule.sourceFolder, unsaved-rule file preview (#17).

Checks: cargo fmt/clippy/test, 82 frontend tests, Vite build and the
msix-studio build pass. npm ci, GUI click tests and real EXE builds were
not run.

Refs #9 #10 #11 #12 #13 #14 #17

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 11:10:00 +09:00

4.0 KiB

설치파일의 Windows 기본 폴더 위치

2026-11-10. EXE 버전이 설치 폴더 외에 ProgramData·공용 파일·사용자 AppData 같은 Windows 기본 폴더에도 파일을 설치하도록 파일 규칙에 대상 루트를 추가했다. 설치파일 탭의 폴더 추가 팝업에서 기본 위치를 드롭다운으로 고르거나 [속성]경로로 직접 입력한다. 화면·모델·입력 검사까지이며 MSI Directory 테이블 생성과 실제 설치 시험은 범위 밖이다.

사용

  1. 설치파일 탭에서 폴더 추가를 누른다.
  2. 기본 위치에서 선택한 폴더, 설치 폴더(INSTALLDIR), Windows 기본 폴더 중 하나를 고르고 폴더 이름을 입력한다. 아래에 만들어질 Windows 경로가 미리 보인다.
  3. **직접 입력…**을 고르면 이름 칸 대신 경로 칸이 나온다. [CommonAppDataFolder]Baron\Config처럼 [속성]하위\경로로 적으며, 속성 없이 적거나 [INSTALLDIR]로 시작하면 설치 폴더 기준이다. 여러 단계 폴더를 한 번에 만들 수 있다.
  4. 만든 위치는 트리에 별도 루트(예: ProgramData CommonAppDataFolder)로 나타나고, 그 아래에서 파일 추가·패턴 규칙을 쓴다.

2026-11-11 변경: 폴더 추가 팝업의 기본 위치 선택·직접 입력은 없어지고, Windows 기본 폴더는 설치파일 탭 오른쪽 위 설치 위치 추가로 트리에 더한다. 하위 폴더는 각 폴더 행의 폴더 추가 버튼으로 만든다(변경 기록).

모델과 실행

  • 프로젝트: FileRule.targetRoot(선택, 기본 빈 문자열 = 설치 폴더)를 추가했다. 비어 있으면 파일에 쓰지 않아 기존 파일과 빌드 계획 해시가 바뀌지 않는다.
  • 허용 루트(TARGET_ROOTS): ProgramFiles64Folder, ProgramFilesFolder, CommonAppDataFolder, AppDataFolder, LocalAppDataFolder. 시스템·Windows 폴더, 여러 제품이 함께 쓰는 공용 파일(CommonFiles64Folder, CommonFilesFolder)과 글꼴(FontsFolder)은 넣지 않았고(2026-11-11 공용 파일·글꼴 제외), 시작 메뉴·바탕화면은 바로가기 탭에서 다룬다. x86 프로젝트는 64비트 폴더를 쓸 수 없다. MSIX는 대상 루트를 쓸 수 없다. 위반은 UnsupportedTargetRoot(*.targetRoot).
  • AppDataFolder·LocalAppDataFolder는 설치한 사용자의 폴더에만 만들어진다(다른 사용자에게는 없음). 화면 설명에 적었다.
  • 설치 경로 표기: 미리보기·입력 검사의 대상 경로는 설치 폴더 기준 상대 경로이고, 다른 루트는 [CommonAppDataFolder]/Baron/x.json처럼 루트를 앞에 붙인다. 같은 상대 경로가 두 루트에 있어도 충돌하지 않는다.
  • 패치 버전: 대상 루트를 바꾸면 설치 위치가 바뀌므로 PatchMovesFiles로 거부한다.
  • 폴더 이름: [로 시작하는 이름은 루트 표기와 헷갈리므로 거부한다.
  • 범위 밖: MSI Directory/Component 생성, 사용자별 폴더의 다중 사용자 배포(활성 설정·자체 복구), 루트 폴더 자체의 제거 정책.

확인 결과

  • Rust 테스트 72개 통과(무시 1개: SDK 통합). 대상 루트 미리보기 경로와 루트 간 비충돌, 시스템 폴더·x86의 64비트 폴더·MSIX 대상 루트 거부, 대상 루트 없는 규칙의 저장 형식 유지를 file_preview.rs에서 검사한다.
  • 프런트엔드 테스트 79개 통과; TypeScript/Vite 빌드와 cargo build -p msix-studio --features custom-protocol 통과. 팝업 선택지(선택 폴더·설치 폴더·허용 루트·직접 입력, x86·MSIX 제한, 이스케이프), 직접 입력 해석과 오류, 트리의 루트별 표시, 파일 추가·패턴 규칙의 대상 루트 설정을 검사한다.
  • 실제 앱에서 팝업을 조작하는 GUI 시험과 다른 루트로의 설치 시험은 수행하지 않았다.

근거