# 버전과 GUID 관리 ## 서로 다른 버전의 구분 | 값 | 목적 | | --- | --- | | productVersion | MSI의 3자리 버전. 예: `1.14.0` | | displayVersion | 사용자 표시용 버전. 사전 배포 표기 허용 | | engineVersion | 제품이 사용하는 엔진 버전. 현재 대상 `14.1` | | PE FileVersion / ProductVersion | 실제 실행 파일에 들어 있는 버전 | | releaseId / buildId | 릴리스/빌드 시도의 고유 식별자 | | project schemaVersion | 생성기 설정 파일 형식의 버전 | MSI ProductVersion은 처음 세 필드만 비교하며 최대값은 각각 255, 255, 65535다. 네 번째 필드만 바꾼 릴리스를 새로운 MSI 업데이트로 처리하지 않는다. [Microsoft ProductVersion](https://learn.microsoft.com/en-us/windows/win32/msi/productversion) 앱 버전과 엔진 `14.1`을 동일시하지 않는다. 기존 `.ism`의 `1.13.1.0`도 MSI 비교 관점은 `1.13.1`이다. 기존 업데이터는 실제 Grimi.exe 버전을 참조하므로 생성 전에 목표 릴리스와 EXE 버전의 매핑을 검사한다. 이미 빌드한 PE의 버전을 생성기가 임의 수정하지 않는다. 불일치는 제품 재빌드 또는 명시적으로 승인된 버전 매핑으로 해결한다. ## 식별자 수명 | 식별자 | 정책 | | --- | --- | | productId | 업데이트 서비스 제품 키. 기존 `E901`; MSI GUID와 별개 | | UpgradeCode | 동일 제품 업그레이드 계열에서 유지 | | ProductCode | 최초/major upgrade 시 신규; minor upgrade 패치 계열에서는 유지 | | PackageCode | 내용이 바뀐 MSI마다 신규; 같은 확정 파일 재배포는 유지 | | Component GUID | 같은 컴포넌트 규칙을 지키는 동안 유지 | | PatchCode | 새 MSP마다 신규; 동일 파일 재배포는 유지 | | Patch family / sequence | 같은 제품 패치 순서와 대체 관계를 명시적으로 관리 | | Bundle UpgradeCode | 번들 업그레이드 계열에서 유지; MSI UpgradeCode와 별개 | | Bundle id / version | 실제 Burn 출력에서 추출하고 탐지·등록 정책에 맞게 관리 | Major/Minor는 앱 버전의 첫째·둘째 숫자를 의미하지 않고 Windows Installer의 업데이트 종류다. 변경된 MSI는 새 PackageCode를 가져야 하며 ProductCode 유지 여부는 업데이트 종류에 따른다. [Windows Installer 업데이트 구분](https://learn.microsoft.com/en-us/windows/win32/msi/patching-and-upgrades) ## EG-BIM 초기 전환 기존 ISM에서 확인한 UpgradeCode는 `{E6381427-A8BC-4506-A428-CE860BDA119F}`, ProductCode는 `{FBEE188C-7D40-4CBD-80DA-89919B116F57}`이다. 이것은 확인한 파일의 값이며 모든 실제 설치본이 동일하다는 보장은 없다. 출시된 설치 파일들의 식별자·언어·아키텍처를 수집해 전환 목록을 확정한다. 초기 설계는 기존 UpgradeCode 유지와 새 ProductCode를 사용하는 전체 전환이다. 기존 제거 CustomAction이 데이터까지 지울 수 있으므로 GUID 연계만으로 전환을 허용하지 않는다. 백업 위치, 실제 삭제 범위, 제거 순서와 복원 시험이 통과해야 전환 경로를 활성화한다. [기존 전환 계획](../plan/02-installer-migration.md) ## 편집과 자동 할당 화면에서 표시명·버전·UpgradeCode를 설정할 수 있지만, 첫 정식 릴리스 이후 계열 식별자는 잠근다. 새 제품/계열 생성은 기존 프로젝트를 덮어쓰지 않고 명시적인 새 계열 작업으로 처리한다. ProductCode/PackageCode/PatchCode는 엔진이 계획 단계에서 할당하고 화면에는 변경 이유를 보여 준다. 정식 빌드의 GUID를 매번 무작위로 모두 재생성하지 않는다. 실행 전에 identity lock revision과 계획된 값을 예약한다. 실패한 작업의 예약 이력은 남기고, 재개 시 동일 바이트 산출물은 재사용한다. 내용을 바꿔 다시 만드는 MSI/MSP는 새 패키지 식별자를 할당한다. 동일 버전으로 서로 다른 파일을 정식 배포하는 것은 기본 금지다. 시험 빌드는 별도 draft buildId로 구분하되 배포 등록을 허용하지 않는다. 사용자 그룹은 버전/GUID를 바꾸는 이유가 아니다. 개발자 테스트를 통과한 동일 파일을 다음 그룹으로 승격한다.