我正在研究一套相关的应用程序,它们都有自己的WiX安装程序。可以想象,这些安装程序之间存在很多重复,我正在尝试对此做些什么。为此,我创建了一个包含一些.wxs
文件的WiX库项目,并且我一直在努力将尽可能多的代码推送到这些.wxs
文件中。到目前为止,哪种方法效果很好。但是,有一件事我似乎无法转移到.wxs
:Upgrade
元素。
这是我的升级代码:
<Upgrade Id="MY-UPGRADE-CODE-GUID">
<!-- If an older version is found replace it -->
<UpgradeVersion OnlyDetect="no" Property="OLDERFOUND"
Maximum="$(var.ProductVersion)" IncludeMaximum="no"/>
<!-- If the same version is found do nothing (OnlyDetect) -->
<UpgradeVersion OnlyDetect="yes" Property="SELFFOUND"
Minimum="$(var.ProductVersion)" IncludeMinimum="yes"
Maximum="$(var.ProductVersion)" IncludeMaximum="yes"/>
<!-- If a newer version is found do nothing (OnlyDetect) -->
<UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND"
Minimum="$(var.ProductVersion)" IncludeMinimum="no"/>
</Upgrade>
<CustomAction Id="AlreadyUpdated" Error="This version of !(wix.Param.Upgrade.ProductName) is already installed. You will have to uninstall it manually before this installer can continue."/>
<CustomAction Id="NoDowngrade" Error="A newer version of !(wix.Param.Upgrade.ProductName) is already installed. You will have to uninstall that version manually before this installer can continue."/>
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize"/>
<!-- If the same version is found execute AlreadyUpdated -->
<Custom Action="AlreadyUpdated" After="FindRelatedProducts">SELFFOUND</Custom>
<!-- If a newer version is found execute NoDowngrade -->
<Custom Action="NoDowngrade" After="FindRelatedProducts">NEWERFOUND</Custom>
</InstallExecuteSequence>
对于Upgrade/@Id
,我使用与Product/@UpgradeCode
相同的值。 (我不确定这是否是必要的,甚至是良好的练习。)我想在某个时候把它放在WixVariable
中但是现在我试图让它与文字GUID一起使用。
我已将CustomAction
和InstallExecuteSequence
移至我的Fragment
文件中的.wxs
。我已经定义了WixVariable
来包含ProductName,因此我可以让每个应用程序的安装程序显示自己的名称。这完全符合我的期望和期望。
但是,当我将Upgrade
元素移动到Fragment
时(如果它位于应用的Product.wxs
文件或其中一个库.wxs
中则无关紧要如果Fragment
与包含InstallExecuteSequence
的{{1}}相同也无关紧要,则会出现以下问题:
Upgrade
的新版本移入单独的Fragment
,但具有相同的Product/@Version
,Product@/UpgradeCode
,和Upgrade/@Id
,我最终安装了2个相同产品,这显然不是我想要的。我会用MajorUpgrade
替换整个事情,是不是因为事实1)它似乎不想在再次安装相同版本时给出错误消息,更重要的是,2)由于某些原因,它不允许在Fragment
内,所以我仍然坚持重复(虽然比以前少了很多)。
那么......如何在不丢失当前功能的情况下将Upgrade
元素移动到.wxs
库中?我做错了什么?
答案 0 :(得分:3)
如wix Linker documentation中所述,链接器将在构建Windows安装程序数据库时遵循片段之间的引用。但这意味着它将忽略产品wxs 未引用(直接或间接通过其他片段)的任何片段。
此行为在您的方案中非常有用,因为它允许您对所有可重用组件之间的依赖关系进行建模,链接器将确保仅包含特定产品所需的依赖关系。
为了确保包含升级逻辑,您有两种选择:
在您的片段中添加一个虚拟Property,并在您的产品wxs中使用PropertyRef引用它。
或者将升级逻辑放在Include元素中,然后指示wix预处理器将其包含在产品wxs中。有关示例,请参阅Wix Preprocessor文档。