【发布时间】:2015-05-13 04:14:17
【问题描述】:
我有一个应该始终传送文件的 WiX 包,但只有在满足条件时才应卸载文件。条件是,如果安装了另一个版本的产品,则不应卸载公共文件(我们不支持真正的升级,我们的升级是将文件安装到具有该软件包版本的新文件夹并安装新版本的公共文件)。
我意识到这可以通过跨组件使用相同的 GUID 或使用合并模块来实现,但我还必须考虑到我有可以安装的 InstallShield 遗留包这一事实。不幸的是,这些包的设计者不知道安装程序发生了什么,他们将文件安装到临时目录,然后将它们复制到新位置,因此 Windows Installer 不知道文件已安装。
我尝试了几种不同的方法。
方法一:
<Component Id="myfile.dll" Guid="{YOUR-GUID-HERE}" Transitive="yes" >
<Condition>OTHER_VERSIONS_PRESENT ~= "FALSE"</Condition>
<File Id="myfile.dll" KeyPath="yes" Source="$(var.PATH_TO_BIN_FILES)myfile.dll" />
</Component>
方法 #2:
<Component Id="myfile.dll" Guid="{YOUR_GUID_HERE}" Permanent="yes" >
<File Id="myfile.dll" KeyPath="yes" Source="$(var.PATH_TO_BIN_FILES)myfile.dll" />
</Component>
<Component Id="myfile.dll_remove" Guid="{YOUR_GUID_HERE}" Transitive="yes" >
<RemoveFile Id="myfile.dll_remove" Name="myfile.dll" On="uninstall" />
<Condition>OTHER_VERSIONS_PRESENT ~= "FALSE"></Condition>
</Component>
其他信息
这是我与自定义操作和条件一起使用的属性:
<Property Id="OTHER_VERSIONS_PRESENT" Value="FALSE" />
这是我对设置 OTHER_VERSIONS_PRESENT 属性的自定义操作的计划。我已根据是否存在其他版本的产品来验证它是否正确设置为 true 或 false。
<Custom Action="FindOtherVersionsOfProduct" After="CostFinalize" />
我也尝试过使用 CDATA 包裹条件的上述方法,但这也失败了。此外,我尝试更改设置属性时的安装顺序。我尝试了不同的条件。但没有任何效果。
提前感谢您给予我的任何支持。
编辑:方法 1 有效,但一旦我将其更改为
<Condition>NOT Installed OR ((REMOVE ~= "ALL") AND (OTHER_VERSIONS_PRESENT ~= "FALSE"))</Condition>
它不再起作用了。
【问题讨论】:
标签: wix windows-installer