답변:
최신 버전 (3.5.1315.0 베타 버전)에서는 자체 버전 대신 MajorUpgrade 요소 를 사용할 수 있습니다.
예를 들어이 코드를 사용하여 자동 업그레이드를 수행합니다. 다운 그레이드를 방지하고 지역화 된 오류 메시지를 제공하며 기존의 동일한 버전을 업그레이드하지 못합니다 (즉, 하위 버전 만 업그레이드).
<MajorUpgrade
AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
AllowSameVersionUpgrades="no"
/>
<MajorUpgrade>
"요소는 뒤에 배치해야합니다 <Package>
. 그렇지 않으면 candle
다음 오류가 발생합니다. "오류 CNDL0107 : 473 열 1의 다음 오류로 인해 스키마 유효성 검사에 실패했습니다. 네임 스페이스의 'Product'요소 ' schemas.microsoft.com/wix/2006/wi '에 잘못된 자식 요소가 있습니다 ' 네임 스페이스 ' schemas.microsoft.com/wix/2006/wi '의 MajorUpgrade ' . 가능한 요소 목록은'Package '입니다. "
AllowDowngrades
또는 을 지정할 필요가 없음을 지적하고 싶습니다 AllowSameVersionUpgrades
. 기본값은 이미 없습니다.
마지막으로 해결책을 찾았습니다. 동일한 문제가있는 다른 사람들을 위해 여기에 게시하고 있습니다 (모두 5 명).
제품 아래에 다음을 추가하십시오.
<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로 교체
ProductVersion
는 세 가지 버전 필드 만 지원합니다. 따라서 네 번째 필드는 전혀 비교되지 않습니다. 에서 VersionMin 및 VersionMax 아래 참고 사항을 참조하십시오 msdn.microsoft.com/en-us/library/aa372379(VS.85).aspx
다음은 주요 업그레이드에 사용하는 일종의 구문입니다.
<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는 동일해야합니다.
<InstallExecute After="RemoveExistingProducts" />
. 당신의 예는 이것을 가지고 있지 않습니다-그것은 책이 잘못되었다는 것을 의미합니까?
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
RemoveExistingProducts
이후에 예약 InstallFinalize
되었으며 assemblyVersion이 변경되지 않았지만 AssemblyProduct와 같은 다른 필드는 dll이 업데이트되지 않았습니다. 나는 파일 비교 루틴의 자비에 있고 싶지 않아
WiX-users 메일 링리스트 에서이 질문을하는 것이 좋습니다 .
WiX는 Windows Installer의 기능을 제대로 이해하는 데 가장 적합합니다. " Windows Installer의 최종 안내서 "를받는 것이 좋습니다.
기존 제품을 제거하는 작업 은 RemoveExistingProducts 작업 입니다. 그 결과는 예정된 위치, 즉 고장으로 인해 이전 제품을 다시 설치하는지 여부와 변경되지 않은 파일을 다시 복사하는지에 따라 결과가 달라 지므로 직접 예약해야합니다.
RemoveExistingProducts
시스템에 설치된 모든 제품 의 ( 요소에 지정된) 속성 <Upgrade>
과 일치하는 현재 설치의 요소를 처리 합니다. 는 관련 제품의 가족을 정의합니다. 이 UpgradeCode가 있고 버전이 지정된 범위에 속 하고 속성이있는 (또는 생략 된) 제품은 제거됩니다.@Id
UpgradeCode
<Product>
UpgradeCode
UpgradeVersion/@OnlyDetect
no
속성 RemoveExistingProducts
설정에 대한 설명서입니다 UPGRADINGPRODUCTCODE
. 이는 제거 중인 제품 의 설치 제거 프로세스 Product/@Id
가 설치중인 제품 의 값인 해당 특성을 수신함을 의미합니다 .
원래 설치에가 포함되어 있지 않은 UpgradeCode
경우이 기능을 사용할 수 없습니다.
이 사이트를 사용하여 WiX 업그레이드에 대한 기본 사항을 이해했습니다.
http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization
그런 다음 샘플 설치 프로그램 (테스트 파일 설치)을 작성한 다음 업그레이드 설치 프로그램 (샘플 테스트 파일 2 개 설치)을 작성했습니다. 이를 통해 메커니즘의 작동 방식에 대한 기본 지식을 얻을 수 있습니다.
Mike가 Apress의 "Windows Installer에 대한 최종 안내서"책에서 말한 것처럼 이해하는 데 도움이되지만 WiX를 사용하여 작성된 것은 아닙니다.
매우 도움이 된 다른 사이트는 다음과 같습니다.
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 "매개 변수 를 사용하라고 지시 했지만 이러한 매개 변수가 주요 업그레이드에 대해 금지 된 것은 아니며 단순히 작동을 중지 한다는 것이 아닙니다 . 따라서 주요 업그레이드와 함께 사용해서는 안됩니다.
Alex Shevchuk의 튜토리얼을 살펴 보는 것이 좋습니다. 그는 MSI에서 WiX 로의 실습 예제 인 Part 8-Major Upgrade 와 함께 WiX를 통한 "주요 업그레이드"에 대해 설명합니다 .
한동안 ( http://www.tramontana.co.hu/wix/lesson4.php 에서 도난당한) 튜토리얼에서 놓친 한 가지 중요한 사항 은 "이 제품의 다른 버전이 이미 설치되어 있습니다"라는 오류를 발생 시켰습니다.
* 작은 업데이트는 하나의 작은 변화 또는 변경이 제품 버전 (major.minor.build)을 변경 보증하지 않습니다 몇 개의 파일을 의미한다. 제품 GUID도 변경할 필요가 없습니다. 어떤 점에서 이전 파일과 다른 새 .msi 파일을 만들 때는 항상 패키지 GUID를 변경해야합니다. 설치 프로그램은 설치된 프로그램을 추적하고 사용자가 이러한 GUID를 사용하여 설치를 변경하거나 제거하려고 할 때 찾습니다. 다른 패키지에 동일한 GUID를 사용하면 설치 프로그램이 혼동됩니다.
마이너 업그레이드 는 제품 버전이 이미 변경되는 변경 사항을 나타냅니다. Product 태그의 Version 속성을 수정하십시오. 제품은 동일하게 유지되므로 제품 GUID를 변경할 필요는 없지만 새로운 패키지 GUID를 얻을 수 있습니다.
주요 업그레이드 는 한 정식 버전에서 다른 버전으로 이동하는 것과 같은 중요한 변경 사항을 나타냅니다. 버전 속성, 제품 및 패키지 GUID를 모두 변경하십시오.
최신 버전의 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와 동일해야합니다.
아래는 나를 위해 일했습니다.
<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와 일치하는지 확인하십시오.
이것은 주요 DOWN 등급으로 도 나를 위해 일한 것입니다 .
<Wix ...>
<Product ...>
<Property Id="REINSTALLMODE" Value="amus" />
<MajorUpgrade AllowDowngrades="yes" />