Document package formats, release workflows, deployment planning and UI concepts. Closes #1
7.9 KiB
Tauri 화면과 명령 인터페이스
2026-10-19 실행 범위 변경: 1차 화면은 앱 정보·파일 구성·패키지 설정·서명·업데이트·검증/빌드다. EXE/Store 선택·과정/마법사 편집·MSP는 첫 UI에 노출하지 않는다. 아래 확장 화면/명령은 후속 계약이다. 현재 설계 참조.
형식별 제작 화면과 CLI
공통 제품/파일 설정 다음에 출력 대상을 편집한다. 각 대상은 format, delivery, distribution을 별도 선택한다. EXE 탭은 설치 경로·레지스트리·과정/마법사·MSP를, MSIX 탭은 identity·manifest·앱 자산·의존성·capabilities·업데이트를 편집한다. MSIX 설치 경로는 OS 관리로 안내한다. Store 설정은 해당 대상을 선택한 경우에만 요구한다.
CLI의 validate/plan/build/export는 --target <targetId> 또는 --all-targets를 받도록 확장한다. CLI와 GUI가 같은 capability 검사를 사용한다. 모든 대상 요청 중 하나만 성공하면 전체 성공 코드를 반환하지 않고 대상별 결과와 PartialFailed를 반환한다. patch 명령은 EXE/MSI 대상 전용이며 MSIX에는 버전 증가 빌드를 안내한다. v2 출력 계약이 아래 기존 EXE 중심 화면에 우선한다.
화면 구성
프로젝트 생성·열기·저장은 .isproj만 지원한다. 시작 화면의 두 버튼과 파일 다이얼로그, 최근 목록, CLI 모두 프로젝트 파일 형식 계약을 따른다. 기존 .json 프로젝트 호환·변환은 제공하지 않는다.
| 화면 | 입력/행동 | 결과 |
|---|---|---|
| 프로젝트 | 생성·열기·저장, 제품명/제조사/엔진, 소스 alias 연결 | 현재 revision, 미확정 필드 |
| 파일 목록 | 파일/폴더 추가, include/exclude, 대상 폴더, 서명 정책 | 실제 설치 트리, 용량, 누락·충돌·변경 파일 |
| 설치 설정 | 기본/기존 경로, perMachine, x64, 필수 런타임 | 설치 디렉터리·사전 조건 미리보기 |
| 설치 과정 | 단계 추가·삭제·활성화·순서·조건, 핸들러 설정 | 모드별 실행 계획, 의존성·필수 단계 검사 |
| 설치 UI | 테마·로고·색상·문구, 지원되는 페이지·입력 항목 편집 | 모드별 미리보기, 선택한 BA 백엔드의 지원 범위 |
| 레지스트리 | hive/view/key/name/type/value 편집 | 형식 검증, 생성/수정/삭제 차이 |
| 버전과 식별자 | 목표 버전, 전체 전환/동일 계열 선택 | 자동 할당 GUID와 변경 이유, 기존 계열 잠금 |
| 릴리스 생성 | 출력 프로필, 서명 프로필, 생성 계획 | 파일/용량/도구/설치 경로 요약과 오류 |
| 패치 생성 | 목표 릴리스, 기준 상태 복수 선택 | 기준별 호환 여부·차이·대체 경로 |
| 작업/이력 | 실행·취소·실패 작업 재검사, 로그 보기 | 단계 진행률, 실패 원인, 결과 폴더 |
| 릴리스 상세 | 파일·서명·검증 증빙, 내보내기 | 확정 결과와 배포 준비 상태 |
파일 수가 수천 개이므로 트리·표는 가상화하고 정렬·검색·필터를 제공한다. 큰 목록은 Rust 쪽에서 페이지 단위로 조회하며 매번 전체 파일 목록을 IPC로 보내지 않는다. 단일 EXE로 만들 수 없는 용량은 생성 시작 전에 가능한 출력 방식을 설명한다.
일반 흐름은 프로젝트 열기 → 설정 수정 → 계획 미리보기 → 빌드 실행 → 결과 확인이다. 패치는 목표 전체 릴리스를 먼저 만들고 기준 릴리스를 선택한다. 설정이 달라졌으면 예전 계획을 실행할 수 없으며 차이를 다시 계산한다.
미서명 개발 결과에는 개발용 · 배포 불가를 표시한다. 서명 완료와 설치 시험 완료를 별도 항목으로 표시하여 성공 아이콘 하나로 뭉뚱그리지 않는다. 업로드/그룹 승격 버튼은 초기 구현 범위에 넣지 않고 배포 시스템용 파일 내보내기를 제공한다.
Tauri IPC 계약
아래 이름은 구현할 Command 제안이며 현재 존재하는 API가 아니다.
| Command | 요청 → 응답 |
|---|---|
| open_project | 허용된 파일 선택 결과 → ProjectHandle, revision, 요약 |
| save_project | handle, expectedRevision, DTO → 새 revision |
| resolve_files | handle, revision → 목록 snapshotId, 요약 |
| list_resolved_files | snapshotId, cursor, filter → page, nextCursor |
| validate_project | handle, revision → ValidationReport |
| preview_install_flow | handle, revision, installMode, mockState → 시스템 변경 없는 실행 계획 |
| preview_installer_ui | handle, revision, backend, installMode → 미리보기 모델과 미지원 기능 |
| plan_release | handle, revision, outputProfiles → planId, 입력 해시, 변경/경고 |
| plan_patch | targetReleaseId, baseStateIds → 기준별 planId 또는 차단 이유 |
| start_build | planId, clientRequestId → jobId |
| get_job / cancel_job | jobId → 작업 상태 / 취소 접수 |
| list_releases / get_release | 조회 조건 / releaseId → 이력 / 상세 |
| export_release | releaseId, 허용된 목적지 → export 결과 |
서버 측 세션의 ProjectHandle과 planId를 사용하고 WebView에서 전달한 절대 경로를 그대로 신뢰하지 않는다. clientRequestId는 중복 클릭/재전송을 같은 jobId로 연결한다. 계획 데이터·권한·프로젝트 revision은 Rust가 재검증한다.
작업 이벤트는 jobId, 단조 증가 sequence, stage, status, completedBytes, totalBytes, messageCode를 포함한다. WebView가 끊겼다가 돌아오면 get_job과 마지막 sequence 이후 기록을 조회한다. 이벤트만이 유일한 상태 저장소가 되지 않는다. 로그는 크기 제한·회전·비밀값 제거를 적용한다.
오류는 code, stage, message, details, retryable, logRef 형태다. 예: MissingRequiredFile, TargetPathCollision, IdentityConflict, PatchIncompatible, PayloadTooLarge, SigningFailed, ToolchainMismatch, FullUpgradeRouteUnavailable. 화면은 원인과 바꿔야 할 설정을 보여 주고 외부 도구 원문은 상세 로그에서 확인한다.
CLI 계약
다음은 구현 예정인 명령 형식이다. 현재 실행 가능한 명령이 아니다.
package-builder validate --project .\EG-BIM.isproj --format json
package-builder plan release --project .\EG-BIM.isproj --profile offline-layout
package-builder build --plan-id <planId>
package-builder plan patch --target <releaseId> --base-state <baseStateId>
package-builder job status --id <jobId> --format json
package-builder export --release <releaseId> --output D:\exports\egbim
CI용 release/patch 편의 명령은 같은 엔진에서 plan+build를 연속 호출하도록 추가한다. 비대화식 실행은 미확정 설정을 질문으로 보류하지 않고 실패 코드로 종료한다. JSON 결과는 stdout, 진행 로그는 stderr로 분리하고 비밀값을 두 출력 모두에서 제거한다.
제안 종료 코드는 0 성공, 2 입력/검증 오류, 3 호환 불가, 4 도구 실행 실패, 5 서명/무결성 실패, 6 작업 잠금 충돌, 130 취소다. 이것은 생성기 종료 코드이며 MSI의 0/3010/1641 등 설치 결과 코드와 혼동하지 않는다. 명령 성공은 해당 명령의 완료만 의미하고 일반 사용자 배포 성공을 의미하지 않는다.
생성 프로그램 자체 배포
Tauri 앱 자체의 설치 패키지·버전·identity는 각 고객 제품의 EXE/MSIX identity와 분리한다. 개발 머신의 WebView2, WiX, SDK 및 서명 연동 도구를 검사하는 환경 진단 화면을 제공한다. 필요한 외부 도구를 자동 다운로드하거나 번들에 재배포하는 기능은 라이선스·고정 버전 검토 후 추가하며, 최초 구현은 관리자가 준비한 도구 프로필을 사용한다.