首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wix:将<Upgrade>迁移到<Fragment>

Wix:将<Upgrade>迁移到<Fragment>
EN

Stack Overflow用户
提问于 2012-07-03 09:51:10
回答 1查看 499关注 0票数 2

我正在开发一套相关的应用程序,它们都有自己的WiX安装程序。正如你可以想象的那样,这些安装程序之间有很多重复,我正试图对此做些什么。为此,我使用一些WiX文件创建了一个.wxs库项目,并一直试图将尽可能多的代码插入到这些.wxs文件中。到目前为止,它的效果还算不错。但是,有一件事我似乎无法移动到.wxsUpgrade元素。

这是我的升级代码:

代码语言:javascript
复制
<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移到了.wxs文件中的Fragment中。我已经定义了一个WixVariable来包含ProductName,所以我可以让每个应用程序的安装程序显示自己的名字。这正是我想要和期待的方式。

但是,当我将Upgrade元素移动到Fragment中(无论它是在应用程序的Product.wxs文件中还是在库.wxs文件中,以及Fragment是否与包含InstallExecuteSequenceFragment相同的情况下),都会出现以下问题:

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

如果没有这样的事实,我会用MajorUpgrade来代替整个程序: 1)当再次安装相同的版本时,它似乎不想给出错误消息;更重要的是,由于某些原因,它不允许在Fragment中运行,所以我仍然被复制所困扰(尽管比以前少了很多)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-03 12:32:07

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

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

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

  1. 将虚拟属性添加到片段中,并在产品wxs中使用PropertyRef引用它。
  2. 或者将升级逻辑放入包括元素中,然后指示wix预处理器将其包含在产品wxs中。有关示例,请参阅Wix预处理器文档。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11308396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档