728x90

Visual Studio 안에 있는 Setup Project로 간단한 설치 프로그램을 만들곤 한다.
(복잡한 설치 구성이 필요 없는 경우 이 설치기능은 참 편하다)

그런데, 프로그램을 일부 수정해서 다시 말아서 배포하는 경우가 있다. 
이때  새로 만든 설치 본으로 설치하려면 다음과 같은 메시지가 떠서 상당히 곤혹스럽게 만들 때가 있다.
img20140115121930001

즉, 이미 다른 버전이 설치되어 있어서 설치가 불가능하므로, 이전에 설치된 버전을 삭제한 후, 다시 설치하라는 의미이다. 업그레이드와는 다른, 즉 이전 버전인지 신규 버전인지를 판단하지 못하는 경우를 의미한다.

그럼 이 문제는 어떻게 해결 해야 하는 걸까?
고민 중에 다음과 같은 문서가 있는 링크를 찾았다.

What are Upgrade, Product and Package Codes used for?

MSI를 구성할 때, 제품만의 고유한 버전을 위해 3가지 값을 사용한다.

Update Code, Product Code, Package Code.

이 세가지 값을 이용하여, 설치된 프로그램의 종류, 버전 등을 구분하여 제공하게 된다. 즉 프로그램 설치/삭제/수정 등의 모든 작업을 운영체제에서 처리할 때, 사용자들이 알아보는 문자열 대신 일종의 일련 번호로써 역할을 하게 되는 것이다. 여기서는 해당 하는 값들과, 그 역할들을 위의 링크에 있는 페이지 내용을 기반을 그대로 옮겨 적어 기록한다.

각 코드 값은 GUID라는 고유 값을 문자열 형태로 나타내도록 되어 있다.
( 예를 들면 {FB23FA93-3A96-4C91-B441-042F22C88BA4} 과 같은 값 )

 

MSI에서의 UpgradeCode란?

Upgrade Code란, 만든 Application을 대표하는 값을 의미한다. 같은 프로그램은 아니지만, 하나의 계열을 이루고 있을 때, 이 코드가 사용된다. 예를 들면 MS Office 제품군 과 같은 계열로 구성되었을 때 같은 제품이라는 의미를 갖게 해주는 것이다. Office 2010 을 예로 들었을 때, Office 2010을 설치하면 Word 2010, Excel 2010 이런 제품들이 설치되게 된다. 이것을 하나로 아우르는 표현을 할 때, Word 2010도, Excel 2010도 같은 Upgrade Code를 갖게된다.

만일 Upgrade Code가 달라지는 경우, 아예 프로그램이 다르다! 라고 인식하게 된다. 그러므로, 완전히 틀려지는 제품이 아닌 경우에는 이 코드의 값을 변경하지 말아야 한다.

MSI에서의 Product Code란?

Product Code란, 같은 프로그램인데, 언어나, 버전이 틀린 경우 그 구분을 위해 제공되는 값이다. 즉 프로그램이 업그레이드를 했거나, 언어가 다른 경우 이 코드 값을 달리해서 적용해야 한다. 이 코드 값을 이용해 실질적인 업그레이드나 추가 작업을 수행하게 된다.

MSI에서의 Pakage Code 란?

앞서 설명한 Upgrade Code 및 Product Code와는 다르게, MSI 파일 자체에 대한 구분을 위한 버전이다. 작은 설치용 프로그램인 경우에는 크게 문제가 없지만, 만일 여러가지 구성요소들을 구분지어 설치파일을 만든 경우 MSI 구성요소들이 달라지게 된다. 즉 각각의 설치 구성요소 별로 구분을 짓기 위해서 이 Package Code를 구성하게 된다.
이 부분은 프로그램의 업그레이드 보다, 패치와 같은 단위 구성요소의 업데이트를 할 때 이 값을 이용해서 설치파일을 구성하게 된다.

 

각 코드 값을 이용한 프로그램 추가/삭제 동작 정리

사실 단순하게 코드 값을 변경해서 이런 저런 설치 동작을 하면 쉽게 이해가 되긴 하지만, 의외로 Setup 프로그램을 만들어 매번 등록 삭제 하려면 정리가 쉽진 않다. 그래서 각 코드의 변경에 따라 어떻게 동작하는지를 정리했다.
(이 내용은 앞서 언급한 링크의 내용을 참고로 구성했다

  1. 같은 Product Code에 같은 Package Code로 된 MSI를 설치하려는 경우 “수정” 혹은 “삭제” 동작을 수행하게 된다.
  2. 같은 Product Code에 다른 Package Code로 된 MSI를 설치하려는 경우 실행되지 않는다. 이 경우 맨 처음 필자가 겪은 메시지창이 뜨면서 설치가 되지 않는다.
  3. 다른 Product Code에 같은 Package Code로 설치하는 경우 “수정” 혹은 “삭제” 동작을 수행하게 된다. 만일 RemovePreviosVersion이 True인 경우 기존 버전을 삭제하고 재설치를 수행하게 된다.
  4. 다른 Product Code에, 다른 Package Code로 설치하는 경우, 인스톨러는 완전히 다른 제품으로 인식해서 새로 설치하게 된다. (중복 설치)

즉 필자 처럼 단순 업그레이드로 구성하려면, Setup Project 옵션의 RemovePreviosVersions를 True로 한 뒤, 새로운 Product Code를 구성해야 한다.

일단, 자동 빌드 구성에 위의 내용을 기반으로 해보니, 별다른 오류 없이 제대로 설치가 되었다.
나중에 Patch 판을 만드는 방법도 고민해봐야 겠다.

728x90
  1. 방문자 2014.07.07 17:44

    좋은 글 감사합니다.

+ Recent posts