gpt4 book ai didi

Wix:将 移动到

转载 作者:行者123 更新时间:2023-12-04 05:40:34 25 4
gpt4 key购买 nike

我正在开发一套相关的应用程序,这些应用程序都有自己的 WiX 安装程序。您可以想象,这些安装程序之间存在大量重复,我正在尝试对此做些什么。为此,我创建了一个 WiX 库项目,其中包含一些 .wxs文件,我一直在尝试将尽可能多的代码放入这些 .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 s 和 InstallExecuteSequenceFragment在我的 .wxs文件。我定义了一个 WixVariable包含 ProductName,所以我可以让每个应用程序的安装程序显示自己的名称。这正是我想要和期望的方式。

但是,当我移动 Upgrade 时元素变成 Fragment (无论它是在应用程序的 Product.wxs 文件中还是在库 .wxs 文件之一中,而且 Fragment 是否与包含 InstallExecuteSequence 的文件相同也无关紧要),出现以下问题:
  • 如果我先运行旧版本的安装程序,然后使用 Upgrade 运行新版本的安装程序搬进一个单独的Fragment ,但具有相同的 Product/@Version , Product@/UpgradeCode , 和 Upgrade/@Id ,我最终安装了 2 次相同的产品,这显然不是我想要的。
  • 如果我安装新的安装程序两次,它不会第二次安装(这是我想要的),但它也不会显示我的错误消息。

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

    那么......我该如何移动我的 Upgrade元素变成 .wxs库而不会失去当前功能?我做错了什么?

    最佳答案

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

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

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

  • 添加虚拟人 Property到您的片段,并使用 PropertyRef 引用它在您的产品 wxs.
  • 或者将您的升级逻辑放在 Include 中元素,然后指示 wix 预处理器将其包含在您的产品 wxs 中。见 Wix Preprocessor文档示例。
  • 关于Wix:将 <Upgrade> 移动到 <Fragment>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11308396/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com