1

我正在使用 Wix 3.8。

首先,我创建了一个安装程序 (.msi),它在安装过程中执行自定义操作(出于测试目的,它只显示一条消息):

产品元素:

<Product Id="PUT-GUID-HERE" Name="MyProduct" 
         Version="1.0.1.100" Manufacturer="Foobar Company"
         UpgradeCode="PUT-GUID-HERE">

自定义操作

<CustomAction Id="Message1" Script="vbscript">
<![CDATA[
MsgBox("First Install?")
]]>
</CustomAction>

<InstallExecuteSequence>
<Custom Action="Message1" 
        Before="InstallInitialize">NOT Installed AND NOT REMOVE</Custom>

现在,当我执行我的 .msi 文件时,该消息将显示在我的安装中:

消息框

接下来,我修改我的产品代码并增加我的版本号以构建更新:

产品元素:

<Product Id="PUT-GUID-HERE" 
         Name="MyProduct" Version="1.0.2.100" 
         Manufacturer="Foobar Company" 
         UpgradeCode="PUT-GUID-HERE">

关于NOT Installed AND NOT REMOVE我期望的情况,当我执行更新时不会出现消息框。但它确实:

消息框

仅在安装时执行而不在更新时执行的自定义操作的正确条件是什么?

4

2 回答 2

2

请注意自定义操作的条件,它们很难正确处理。这是一份MSI 条件备忘单,可以帮助您。我没有测试过这些条件——测试是唯​​一的保证。这是另一张包含更多高级信息的工作表(推荐)。

这是一篇有趣的帖子:如何添加仅在卸载时发生的 WiX 自定义操作(通过 MSI)?

您建议的情况看起来不错,但请查看工作表。此外 - 补丁具有特定于补丁的属性,例如 PATCH 和 MSIPATCHREMOVE。根据需要,对自定义操作使用这些条件,使它们在补丁期间运行或不运行。我认为,如果您打算使用补丁,则应将自定义操作设置为在补丁期间运行。

我为您消除了硬编码的指南。小心发布指南 - 通过简单的复制和粘贴,您的独特指南不再那么独特。所有硬编码的指南都可能导致真正的问题。

于 2014-09-05T08:25:21.833 回答
2

最后它在以下条件下工作:

NOT (WIX_UPGRADE_DETECTED OR UPGRADINGPRODUCTCODE) AND NOT (REMOVE="ALL")

使用此条件,我的操作仅对安装有反应,但对更新和卸载没有反应。

重要提示:安装程序和更新的 .msi 必须包含该条件。

于 2014-09-05T08:05:56.823 回答