우리가 흔히 아는 윈도우 인스톨러 즉 MSI(MicroSoft Installer) 를 만드는 프로그램은 바로 wix 이다. wix 의 candle, light 명령으로 wxs 파일을 말아서 msi 를 만든다.
upgrade 란?
그런데 어떻게 window installer 는 같은 어떠한 두 msi 파일을 같은 "종류" 의 프로그램으로 인식을 하고, 재설치시에 해당 프로그램을 지우고 업그레이드를 하는 등의 행위를 할 수 있을까? 그건 바로 윈도우에서 규정한 여러 업그레이드 방식을 따라 wxs 파일을 만들면 된다. 윈도우 공식 문서를 살펴보면은 small, minor, major 등의 다양한 업그레이드 방식이 있음을 알 수 있다. 지금부터 그 방식들 중의 주요한 방법 2개인 major upgrade, minor upgrade란 무엇인가 그리고 그것을 동작시키기 위한 조건을 살펴보도록 하겠다.
wxs, msi
우리가 msi 를 만들기 위한 "설계도" 역할을 하는 것이 바로 .wxs 파일이다. 이 파일은 크게 3가지 부분으로 구성이 되어 있는데, 1. Wix: 윅스의 버전정보와 구성요소 트리. 2. Feature : 윅스에 포함될 구성요소ID 집합. 3. CustomAction, InstallExecuteSequence : 파일의 설치 및 삭제 과정에서 사용자가 지정한 명령. 으로 구성이 되어있다. 어떠한 프로그램이 돌아가기 위해 필요한 수많은 소스코드들(컴파일된 파이썬 파일들... 사용할 서드파티 라이브러리들...)을 바로 이런식으로 wxs 파일에 입력을 하고, 그것을 패키징 하여 msi 로 만들 수 있다. 우리는 이렇게 만든 지도인 wxs 파일을 msi 로 만드는 과정은 바로 candle, light 를 사용하는 것이다. candle은 wix를 컴파일하는 역할을 주로 수행한다(.wix -> .wxs -> .wixobj). light 는 wixobj를 링크하고, wix에서 참조하는 파일들을 패키징하여 msi 생성하는 역할을 수행한다.
minor upgrade
서론이 길었다. minor upgrade, major upgrade 는 과연 무엇일까? minor upgrade 는 기존에 설치된 버전의 파일은 유지하면서, 새로운 파일을 추가하기 위해 사용되는 방법이다. 이 방법은 기존에 깔린 프로그램을 삭제하지 않고 추가적인 기능이 생겼을 경우에 사용을 한다. minor upgrade 를 하는 조건은 무엇일까? 그 조건은 다음과 같다. Product Code(wix에서는 Product의 Id)는 유지, Package Code(wix에서는 Package의 Id로써, 보통 미지정하여 자동 생성함)는 변경, msi 파일 이름을 유지, component의 이름과 UUID를 유지, installexecutesequence 에 <RemoveExistingProducts Before='InstallInitialize" /> 를 추가 라는 조건이 있다. component 의 이름과 UUID 를 유지한다는 점에서 기존에 깔린 파일을 변경하지 않겠다는 지도(wxs)의 의지를 확인할 수 있다.
major upgrade
major upgrade 는 기존에 깔린걸 지우고 새로 내거를 깔겠다는 의미이다. minor upgrade 는 이미 깔린 파일을 변경할 수는 없지만, major upgrade 는 재설치의 개념이기 때문에 깔린 파일을 변경할 수 있다. 그 조건은 다음과 같다. Product Code를 변경, Upgrade Code를 설정, Upgrade Code 에 대응되는 table 필요, component의 UUID 를 변경 이라는 조건이 있다. product code 가 변경된다는 점 그리고 component UUID 가 변경된다는 점에서 전에 깔린 것과 다른 product 이고 나는 새로 깔겠다는 의지를 확인하면 된다.
이 외에도 customaction 이나 installexecutesequence 에서 시점을 잘 확인하면 wix 의 upgrade 를 잘 활용할 수 있을 것이다. 화이팅!!
'개발' 카테고리의 다른 글
[wix] flask 프로젝트 윈도우 패키징 (1) | 2024.09.13 |
---|---|
[Flask] Frontend 템플릿 Jinja 구조 (0) | 2024.07.25 |
[Flask] flask backend 템플릿 구조 (0) | 2024.07.24 |
[Window] win32api, Microsoft installer (0) | 2023.10.12 |
[개발] Lock 과 동시성(python) (0) | 2023.09.18 |