【发布时间】:2016-09-06 16:11:52
【问题描述】:
我想保留之前版本的 Bootstrapper App,如何实现?
我知道我们可以在 MSI 中使用 Upgrade 标签,我们可以在其中识别不同的版本并根据这些执行卸载操作。
现在,我有一个捆绑应用程序,它具有一个或多个使用一些 UpgradeCode 的 MSI。每次我创建一个新版本时,我都会升级 MSI 和这个捆绑应用程序。当我继续安装更高版本的 Bundle App 时,它会卸载以前的 Bundle 版本,这不是我想要的。我想保留以前版本的 Bundle Application。
Bundle 中是否也有类似 UpgradeVersion 的东西,我们可以在其中识别不同的版本并选择性地卸载。
我的Bundle文件代码sn-p:
<Bundle Name="myApp"
Version="1.0.0.0"
Manufacturer="Myself"
UpgradeCode="SOME-GUID">
<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost" >
...
</BootstrapperApplicationRef>
<Chain>
<PackageGroupRef Id= 'WindowsInstaller45'/>
<PackageGroupRef Id ='NetFx45Offline'/>
<PackageGroupRef Id ='MY_MSI'/>
</Chain>
</Bundle>
<Fragment Id ='PkgFragments'>
<PackageGroup Id ="MY_MSI">
<MsiPackage SourceFile= "$(var.Installer.TargetPath)"
Id="MYAPP"
Cache ="yes"
Visible ="no"
DisplayInternalUI ="no"
Permanent="no">
<MsiProperty Name='INSTALLLOCATION' Value='[InstallFolder]' />
<MsiProperty Name='SELECT_UNINST' Value='[UninstallPrevVersion]' />
</MsiPackage>
</PackageGroup>
</Fragment>
我的产品 WIX 文件代码 sn -p
<Product Id="*"
Name="$(var.ProductName)"
Version="$(var.ProductVersion)"
Manufacturer="$(var.ManufacturerName)"
UpgradeCode="$(var.UpgradeCode)">
<Property Id="SELECT_UNINST" Secure="yes">1</Property>
<Upgrade Id="SOME-GUID2">
<UpgradeVersion Minimum="0.0.0.0" Maximum="$(var.ProductVersion)" IncludeMinimum="yes" IncludeMaximum="yes" Property="UNINSTALL_PREV_VERSION" />
</Upgrade>
<CustomAction Id="UninstPrev" Property="UNINSTALL_PREV_VERSION" Value="0" />
<InstallExecuteSequence>
<Custom Action="UninstPrev" Before="InstallInitialize"><![CDATA[SELECT_UNINST <> 1]]></Custom>
<RemoveExistingProducts Overridable="no" After="UninstPrev"></RemoveExistingProducts>
</InstallExecuteSequence>
</Product>
【问题讨论】:
-
希望您的产品在升级期间保持落后,这与升级所需要的完全相反。如果你想让他们留下来,不要把他们当作同一个产品,给他们新的升级 GUID 和产品 GUID。保留每个升级 guid 的列表,当您想要删除它时,添加一个
标记来引用您想要删除的特定升级 GUID,并在您的 BootstrapperApplication dll 中相应地处理 OnPlanRelatedBundle。
标签: wix windows-installer