37 결정적인 정체와 재현 가능한 패키지
Windows Installer 는 변하지 않아야 하는 GUID 와 키로 것들을 식별한다: 같은 구성 요소는 모든 판에서 같은 ComponentId 를 지켜야 하고, 그러지 않으면 복구와 업그레이드가 어긋난다. 손으로 적어 두는 대신 내용에서 만들어 내면 값이 변하지 않고 빌드도 재현 가능해진다. 이 문서는 rubrapack 의 규칙을 적는다. 변하지 않기만 하면 다른 규칙도 된다.
37.1 이름에서 만드는 GUID(UUID 8판) [spec: RFC 9562]#
digest = SHA-256( u32le(len(tag)) || tag
|| u32le(1) (형식 판)
|| 필드마다: u32le(len(field)) || field ) (필드는 UTF-8)
uuid = digest[0..16), 그다음 바이트 6 = (바이트 6 & 0x0F) | 0x80 (8판)
바이트 8 = (바이트 8 & 0x3F) | 0x80 (변종 10)
text = "{" + hex(바이트 0-3) "-" hex(4-5) "-" hex(6-7) "-" hex(8-9) "-" hex(10-15) + "}"
대문자, 바이트 순서대로
길이 접두는 ("ab","c") 와 ("a","bc") 를 가르고, 꼬리표(tag)는 서로 다른 종류의 정체를 가른다.
| 정체 | 꼬리표 | 필드 |
|---|---|---|
| ComponentId | rubrapack.component | 업그레이드 코드, 범위(machine), 구성 요소 아키텍처, 논리 대상 경로(<dir id>/<파일 이름>), 키 경로 종류(file), 키 경로 이름(File 키) |
| ProductCode | rubrapack.product | 업그레이드 코드, 아키텍처, 범위, 판의 앞 세 부분 |
| 패키지 코드(재현 빌드) | rubrapack.package | 패키지 코드를 모두 0 으로 두고 지은 패키지의 SHA-256 16진 |
ProductCode 는 세 부분 판과 함께 바뀌고 - 메이저 업그레이드에 필요한 것 - ComponentId 는 바뀌지 않는다.
37.2 키#
표 키(File, Component, Directory)는 식별자다: [A-Za-z_][A-Za-z0-9_.]*, 최대 72자. rubrapack 은 파일과 폴더에는 작성자의 ID 를 그대로 쓰고 나머지는 끌어낸다:
key = 접두 + "_" + SHA-256(논리 이름)의 소문자 16진 앞 20자리
구성 요소는 접두 C(논리 이름: File 키), 중간 폴더는 D
(논리 이름: "<표준 폴더>/<부분>/<부분>..."), 와일드카드에서 온 파일은 F
37.3 재현 가능한 패키지#
시계, 컴퓨터, 해시 표의 순서에 기대는 것이 하나도 없으면 패키지는 바이트까지 재현된다: 고정된 CFB 디렉터리 시각(0), 고정된 캐비닛 날짜, 문자열의 바이트 순서로 매긴 문자열 id, 키로 정렬한 행, 고정된 순서의 스트림, 무작위 GUID 없음. 패키지 파일마다 달라야 하는 정체는 패키지 코드 하나뿐이다. 재현이 중요하면 (위처럼) 내용에서 끌어내고, 아니면 무작위로 쓴다.