WiX 설치 프로그램 업그레이드를 구현하는 방법은 무엇입니까?


233

직장에서 설치 패키지를 구축 하기 위해 WiX 를 사용 합니다. 제품 X를 설치하면 해당 시스템에서 해당 제품의 이전 버전이 설치 제거되기를 원합니다.

인터넷의 여러 곳에서 주요 업그레이드에 대해 읽었지만 작동시키지 못했습니다. 누구나 이전 버전 제거 기능을 WiX에 추가하기 위해 수행해야하는 정확한 단계를 지정할 수 있습니까?

답변:


189

최신 버전 (3.5.1315.0 베타 버전)에서는 자체 버전 대신 MajorUpgrade 요소 를 사용할 수 있습니다.

예를 들어이 코드를 사용하여 자동 업그레이드를 수행합니다. 다운 그레이드를 방지하고 지역화 된 오류 메시지를 제공하며 기존의 동일한 버전을 업그레이드하지 못합니다 (즉, 하위 버전 만 업그레이드).

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

8
이에 관한 Bob Arnson의 블로그 게시물 은 많은 유용한 정보를 제공합니다.
Dave Andersen

17
참고 : 어디에도 문서화되어 있지 않지만 " <MajorUpgrade>"요소는 뒤에 배치해야합니다 <Package>. 그렇지 않으면 candle다음 오류가 발생합니다. "오류 CNDL0107 : 473 열 1의 다음 오류로 인해 스키마 유효성 검사에 실패했습니다. 네임 스페이스의 'Product'요소 ' schemas.microsoft.com/wix/2006/wi '에 잘못된 자식 요소가 있습니다 ' 네임 스페이스 ' schemas.microsoft.com/wix/2006/wi '의 MajorUpgrade ' . 가능한 요소 목록은'Package '입니다. "
Rob W

21
+1이 답변은 가능한 많은 투표를 받아야합니다. 공감 율이 5 배이지만 오래된 접근법을 사용하는 답변을 찾는 것이 매우 유혹적입니다.
Lynn Crumbling

1
좋은 지적. 나는 사람들이 그것을 가지고 있지 않아서 그것을 무시하지 않도록 예제를 추가했습니다!
Ant

6
AllowDowngrades또는 을 지정할 필요가 없음을 지적하고 싶습니다 AllowSameVersionUpgrades. 기본값은 이미 없습니다.
Luminous

221

마지막으로 해결책을 찾았습니다. 동일한 문제가있는 다른 사람들을 위해 여기에 게시하고 있습니다 (모두 5 명).

  • 제품 ID를 *로 변경하십시오.
  • 제품 아래에 다음을 추가하십시오.

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="YOUR_GUID">  
       <UpgradeVersion
          Minimum="1.0.0.0" Maximum="99.0.0.0"
          Property="PREVIOUSVERSIONSINSTALLED"
          IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade> 
    
  • InstallExecuteSequence에서 다음을 추가하십시오.

    <RemoveExistingProducts Before="InstallInitialize" /> 

지금부터 제품을 설치할 때마다 이전에 설치된 버전이 제거되었습니다.

참고 : 업그레이드 ID를 자신의 GUID로 교체


153
그렇습니다. WiX를 배우는 것은 누군가가 간단한 행동을하기 위해 '합리적으로'결정한 모호한 주문을 알아 내려고하는 것과 같습니다. 유닉스와 같은 종류.
mmr

6
또한 "제품 ID를 *로 변경"은 정확히 무엇을합니까? 매번 새로운 제품 ID를 생성합니까? 제품에 더 이상 고정 ID가없는 결과가 있습니까? 과잉 인 것 같아
Anthony

10
@Antony, @Dror Helper : "*"를 사용하여 새 GUID를 생성해서는 안된다는 확신이 듭니다. (Upgrade Id = "") 내부의 GUID는 하드 코딩되고 수정되어야하며 (Product UpgradeCode = "") 속성의 GUID와 일치해야합니다.
Jonathan Hartley

37
실제 GUID가 없도록 예제를 편집해야한다고 생각합니다. 나는 사람들이 그것을 복사하여 붙여 넣고 그것을 그대로 사용할 것이라고 확신합니다. "YOUR-PRODUCT'S-UPGRADECODE-GUID-HERE"를 사용 하시겠습니까?
브라운

12
귀하의 예에 버그가 있습니다. MSI ProductVersion는 세 가지 버전 필드 만 지원합니다. 따라서 네 번째 필드는 전혀 비교되지 않습니다. 에서 VersionMin 및 VersionMax 아래 참고 사항을 참조하십시오 msdn.microsoft.com/en-us/library/aa372379(VS.85).aspx
스리 Ratnakumar

89

다음은 주요 업그레이드에 사용하는 일종의 구문입니다.

<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
 <Upgrade Id="PUT-GUID-HERE">
    <UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
    <UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

@Brian Gillespie가 언급했듯이 원하는 최적화에 따라 RemoveExistingProducts를 예약 할 다른 장소가 있습니다. PUT-GUID-HERE는 동일해야합니다.


2
필자는 여기 Wix에 대한 Nick Ramirez의 저서에서 "업그레이드 및 패치"섹션을 읽고 있으며 InstallInitialize 후에 RemoveExistingProducts를 예약하면 예약해야합니다 <InstallExecute After="RemoveExistingProducts" />. 당신의 예는 이것을 가지고 있지 않습니다-그것은 책이 잘못되었다는 것을 의미합니까?
Wim Coenen

3
InstallExecute를 명시 적으로 예약하지 않았습니다.
Rob Mensching

1
난 아니야 WiX v3.6에서 Burn은 사소한 업그레이드를 쉽게 수행 할 수 있지만 Burn 없이는 마이너 업그레이드를 기본적으로 사용할 수 없게 만드는 사용자의 수동 상호 작용이 필요합니다 (명령 줄 옵션 제공). :)
Rob Mensching

1
@RobMensching : 최신 버전 위에 이전 버전을 설치하지 않으려면 어떻게해야합니까? 귀하의 답변이 저에게 효과적입니다 (WiX v3.5.2519.0으로 전혀 컴파일 할 수있는 유일한 "주요 업그레이드"예).하지만 이전 버전을 설치할 수 있습니다 (그 후 "Add / 프로그램 제거 ").
Christian Specht

4
자, 이 답변 에서 MajorUpgrade 요소 를 찾았 습니다. 요소 는 다운 그레이드 방지를 포함하여 원하는 것을 정확하게 수행합니다.
Christian Specht

40

Product 요소 내부의 Upgrade 요소와 적절한 작업 일정을 결합하면 나중에 제거 할 수 있습니다. 제거하려는 모든 제품의 업그레이드 코드를 나열하십시오.

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

빌드에주의를 기울이면 사람들이 실수로 이전 버전의 제품을 최신 버전 위에 설치하지 못하게 할 수 있습니다. 이것이 최대 값 필드입니다. 설치 프로그램을 빌드 할 때 UpgradeVersion Maximum을 빌드중인 버전으로 설정하지만이 시나리오를 방지하기 위해 IncludeMaximum = "no"를 설정합니다.

RemoveExistingProducts 예약과 관련하여 선택할 수 있습니다. InstallFinalize 후에 다른 사람이 권장 한 InstallInitialize 이후가 아니라 일정을 예약하는 것이 좋습니다.

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>

새 파일과 레지스트리 키가 복사 될 때까지 이전 버전의 제품이 설치된 상태로 유지됩니다. 이를 통해 이전 버전의 데이터를 새 버전으로 마이그레이션 할 수 있습니다 (예 : 사용자 기본 설정 저장소를 레지스트리에서 XML 파일로 전환했지만 정중하고 설정을 마이그레이션하려는 경우). 이 마이그레이션은 InstallFinalize 직전에 지연된 사용자 지정 작업으로 수행됩니다.

또 다른 이점은 효율성입니다. 변경되지 않은 파일이 있으면 InstallFinalize 후 일정을 예약 할 때 Windows Installer가 해당 파일을 다시 복사하지 않습니다. InstallInitialize 이후에 예약하면 이전 버전이 먼저 완전히 제거 된 다음 새 버전이 설치됩니다. 이로 인해 파일이 불필요하게 삭제되고 다시 복사됩니다.

다른 예약 옵션에 대해서는 MSDN의 RemoveExistingProducts 도움말 항목을 참조하십시오. 이번 주 링크는 다음과 같습니다. http://msdn.microsoft.com/en-us/library/aa371197.aspx


2
@Brian Gillespie : "... 변경되지 않은 파일이있는 경우 ..."는 무엇을 의미합니까? Windows Installer가 파일, AssemblyVersion, AssemblyFileVersion, 파일 크기 등을 바꿀시기를 결정하는 기준은 무엇입니까?
donttellya

2
@donttellya +1은 이것을 어려운 방법으로 배웠습니다. RemoveExistingProducts이후에 예약 InstallFinalize되었으며 assemblyVersion이 변경되지 않았지만 AssemblyProduct와 같은 다른 필드는 dll이 업데이트되지 않았습니다. 나는 파일 비교 루틴의 자비에 있고 싶지 않아

16

WiX-users 메일 링리스트 에서이 질문을하는 것이 좋습니다 .

WiX는 Windows Installer의 기능을 제대로 이해하는 데 가장 적합합니다. " Windows Installer의 최종 안내서 "를받는 것이 좋습니다.

기존 제품을 제거하는 작업RemoveExistingProducts 작업 입니다. 그 결과는 예정된 위치, 즉 고장으로 인해 이전 제품을 다시 설치하는지 여부와 변경되지 않은 파일을 다시 복사하는지에 따라 결과가 달라 지므로 직접 예약해야합니다.

RemoveExistingProducts시스템에 설치된 모든 제품 의 ( 요소에 지정된) 속성 <Upgrade>과 일치하는 현재 설치의 요소를 처리 합니다. 는 관련 제품의 가족을 정의합니다. 이 UpgradeCode가 있고 버전이 지정된 범위에 속 하고 속성이있는 (또는 생략 된) 제품은 제거됩니다.@IdUpgradeCode<Product>UpgradeCodeUpgradeVersion/@OnlyDetectno

속성 RemoveExistingProducts설정에 대한 설명서입니다 UPGRADINGPRODUCTCODE. 이는 제거 중인 제품 의 설치 제거 프로세스 Product/@Id가 설치중인 제품 의 값인 해당 특성을 수신함을 의미합니다 .

원래 설치에가 포함되어 있지 않은 UpgradeCode경우이 기능을 사용할 수 없습니다.


21
의심 할 여지없이 Mike는 자신이 무엇을 말하고 있는지에 대해 정확히 알고 있지만 Windows Installer가 무엇을하고 있는지에 대한 확고한 이해로 마음을 어지럽히는 것을보고 절망에 빠져 있습니다. 그것을 알기 전에, 테크놀로지 타운의 외곽에있는 엔터프라이즈 클라이언트를 대상으로 Java 및 .NET 컨설팅 작업을 수행 할 것입니다. 다음 프로젝트는 NSIS와 함께 설치 될 수 있다고 생각합니다.이 어셈블리는 복잡한 어셈블리 언어와 같은 모든 결함에 대해 Windows Installer가 수행하는 작업을 이해하지 못했습니다.
Jonathan Hartley

2
@Tartley-InnoSetup을 사용하면 어셈블리와 같은 언어를 절약 할 수 있습니다. :) IStool도 가져와야 도움이됩니다. 또한 - 간단한을 위해 너무 복잡 모든 설치 것에 동의하지만, 나는 그들이 정말 SQL처럼 ... 서버 2008 뭔가를 설치하는 이러한 복잡성을 필요가 있다고 생각
로마 Starkov

11

이 사이트를 사용하여 WiX 업그레이드에 대한 기본 사항을 이해했습니다.

http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

그런 다음 샘플 설치 프로그램 (테스트 파일 설치)을 작성한 다음 업그레이드 설치 프로그램 (샘플 테스트 파일 2 개 설치)을 작성했습니다. 이를 통해 메커니즘의 작동 방식에 대한 기본 지식을 얻을 수 있습니다.

Mike가 Apress의 "Windows Installer에 대한 최종 안내서"책에서 말한 것처럼 이해하는 데 도움이되지만 WiX를 사용하여 작성된 것은 아닙니다.

매우 도움이 된 다른 사이트는 다음과 같습니다.

http://www.wixwiki.com/index.php?title=Main_Page


이 페이지의 예는 예상대로 wix.tramontana.co.hu/tutorial/upgrades-and-modularization/…으로 작동하지 않습니다 . 나는 그것을 가지고 놀았다. 페이지에서 금지 될 것이라고 다운 그레이드해도 다운 그레이드 가능
sergtk

10

WiX 설명서를 읽고 예제를 다운로드했지만 여전히 업그레이드에 많은 문제가있었습니다. 마이너 업그레이드는 해당 제거를 지정할 가능성에도 불구하고 이전 제품의 제거를 실행하지 않습니다. 나는 조사에 하루 이상을 보냈고 WiX 3.5가 업그레이드를위한 새로운 태그를 도입 한 것을 발견했다. 사용법은 다음과 같습니다.

<MajorUpgrade Schedule="afterInstallInitialize"
        DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." 
        AllowDowngrades="no" />

그러나 문제 의 주된 이유 는 설명서 에서 소규모 및 소규모 업그레이드에 " REINSTALL = ALL REINSTALLMODE = vomus "매개 변수 를 사용하라고 지시 했지만 이러한 매개 변수가 주요 업그레이드에 대해 금지 된 것은 아니며 단순히 작동을 중지 한다는 것이 아닙니다 . 따라서 주요 업그레이드와 함께 사용해서는 안됩니다.



7

한동안 ( http://www.tramontana.co.hu/wix/lesson4.php 에서 도난당한) 튜토리얼에서 놓친 한 가지 중요한 사항 은 "이 제품의 다른 버전이 이미 설치되어 있습니다"라는 오류를 발생 시켰습니다.

* 작은 업데이트는 하나의 작은 변화 또는 변경이 제품 버전 (major.minor.build)을 변경 보증하지 않습니다 몇 개의 파일을 의미한다. 제품 GUID도 변경할 필요가 없습니다. 어떤 점에서 이전 파일과 다른 새 .msi 파일을 만들 때는 항상 패키지 GUID를 변경해야합니다. 설치 프로그램은 설치된 프로그램을 추적하고 사용자가 이러한 GUID를 사용하여 설치를 변경하거나 제거하려고 할 때 찾습니다. 다른 패키지에 동일한 GUID를 사용하면 설치 프로그램이 혼동됩니다.

마이너 업그레이드 는 제품 버전이 이미 변경되는 변경 사항을 나타냅니다. Product 태그의 Version 속성을 수정하십시오. 제품은 동일하게 유지되므로 제품 GUID를 변경할 필요는 없지만 새로운 패키지 GUID를 얻을 수 있습니다.

주요 업그레이드 는 한 정식 버전에서 다른 버전으로 이동하는 것과 같은 중요한 변경 사항을 나타냅니다. 버전 속성, 제품 및 패키지 GUID를 모두 변경하십시오.


3
패키지 : ID 유형 : AutoGuidGuid 설명 : 제품 또는 병합 모듈의 패키지 코드 GUID입니다. 제품을 컴파일 할 때 각 빌드마다 패키지 코드를 생성 할 수 있도록이 속성을 설정하지 않아야합니다. 병합 모듈을 컴파일 할 때이 속성을 모듈화 GUID로 설정해야합니다. ---- 따라서 패키지 ID에주의를 기울일 필요가 없습니다.
Cooper. 우

귀하의 링크는 죽었습니다
bam500

5

최신 버전의 WiX (3.0)를 사용하고 있는데 위의 작업을 수행 할 수 없습니다. 그러나 이것은 효과가있었습니다.

<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
     Minimum="1.0.0.0"  IncludeMinimum="yes"
     Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>

PUT-GUID-HERE는 제품의 UpgradeCode 속성에 정의한 GUID와 동일해야합니다.


2

아래는 나를 위해 일했습니다.

<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0" 
    Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
    <UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0" 
        RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

제품의 업그레이드 코드가 업그레이드의 ID와 일치하는지 확인하십시오.


1

이것은 주요 DOWN 등급으로 도 나를 위해 일한 것입니다 .

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.