2

我正在开发一套相关的应用程序,它们都有自己的 WiX 安装程序。您可以想象,这些安装程序之间有很多重复,我正在尝试对此做些什么。为此,我创建了一个包含一些.wxs文件的 WiX 库项目,并且我一直在尝试将尽可能多的代码放入这些.wxs文件中。到目前为止,大部分工作都很好。但是,有一件事我似乎无法移至 a .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,我使用与 for 相同的值Product/@UpgradeCode。(我不确定这是否有必要,甚至是好的做法。)我想WixVariable在某个时候把它放在 a 中,但现在我正试图让它与文字 GUID 一起工作。

我已经将CustomActions 和 theInstallExecuteSequence移到了Fragment我的.wxs文件中。我已经定义了 aWixVariable来包含 ProductName,所以我可以让每个应用程序的安装程序显示自己的名称。这正是我想要和期望的方式。

但是,当我将Upgrade元素移动到 a中时Fragment(无论它是在应用程序的Product.wxs文件中还是在库文件之一中,并且它是否与包含 的同一个.wxs也无关紧要),以下问题发生:FragmentInstallExecuteSequence

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

我会用 a 替换整个东西MajorUpgrade,如果不是因为 1)它似乎不想在再次安装相同版本时给出错误消息,更重要的是,2)它不允许在 aFragment出于某种原因,所以我仍然坚持重复(尽管比以前少了很多)。

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

4

1 回答 1

3

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

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

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

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

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

于 2012-07-03T12:32:07.923 回答