Wix:将<upgrade>移动到<fragment> </fragment> </upgrade>

时间:2012-07-03 09:51:10

标签: wix wix3.5

我正在研究一套相关的应用程序,它们都有自己的WiX安装程序。可以想象,这些安装程序之间存在很多重复,我正在尝试对此做些什么。为此,我创建了一个包含一些.wxs文件的WiX库项目,并且我一直在努力将尽可能多的代码推送到这些.wxs文件中。到目前为止,哪种方法效果很好。但是,有一件事我似乎无法转移到.wxsUpgrade元素。

这是我的升级代码:

<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一起使用。

我已将CustomActionInstallExecuteSequence移至我的Fragment文件中的.wxs。我已经定义了WixVariable来包含ProductName,因此我可以让每个应用程序的安装程序显示自己的名称。这完全符合我的期望和期望。

但是,当我将Upgrade元素移动到Fragment时(如果它位于应用的Product.wxs文件或其中一个库.wxs中则无关紧要如果Fragment与包含InstallExecuteSequence的{​​{1}}相同也无关紧要,则会出现以下问题:

  • 如果我首先运行旧版本的安装程序,然后将Upgrade的新版本移入单独的Fragment,但具有相同的Product/@VersionProduct@/UpgradeCode,和Upgrade/@Id,我最终安装了2个相同产品,这显然不是我想要的。
  • 如果我安装新安装程序两次,它将不会第二次安装(这是我想要的),但它也不会显示我的错误消息。

我会用MajorUpgrade替换整个事情,是不是因为事实1)它似乎不想在再次安装相同版本时给出错误消息,更重要的是,2)由于某些原因,它不允许在Fragment内,所以我仍然坚持重复(虽然比以前少了很多)。

那么......如何在不丢失当前功能的情况下将Upgrade元素移动到.wxs库中?我做错了什么?

1 个答案:

答案 0 :(得分:3)

wix Linker documentation中所述,链接器将在构建Windows安装程序数据库时遵循片段之间的引用。但这意味着它将忽略产品wxs 引用(直接或间接通过其他片段)的任何片段。

此行为在您的方案中非常有用,因为它允许您对所有可重用组件之间的依赖关系进行建模,链接器将确保仅包含特定产品所需的依赖关系。

为了确保包含升级逻辑,您有两种选择:

  1. 在您的片段中添加一个虚拟Property,并在您的产品wxs中使用PropertyRef引用它。

  2. 或者将升级逻辑放在Include元素中,然后指示wix预处理器将其包含在产品wxs中。有关示例,请参阅Wix Preprocessor文档。