【问题标题】:Perform Custom Action Based on Mode - WIX根据模式执行自定义操作 - WIX
【发布时间】:2011-08-05 06:52:44
【问题描述】:

我们已经为我们的应用程序创建了 WIX 安装程序。我们面临的问题是: 我们已经定义了两个不同的自定义操作(比如 ActionForInstall 和 ActionForUninstall),我们希望在以下情况下执行这些操作: ActionForInstall :应该在安装、产品升级、维护模式时运行(用于修复和修改) ActionForUninstall : 应该只在卸载时运行。

但我们无法设置适当的条件。你可以参考代码:

<Custom Action=ActionForInstall After='InstallFinalize' > 
    (NOT Installed) OR (Installed AND ((MaintenanceMode = "Modify") OR (MaintenanceMode = "Repair")) AND (NOT (MaintenanceMode = "Remove"))) OR  ((UPGRADINGPRODUCTCODE) AND NOT(REMOVE ~= "ALL"))
</Custom>
<Custom Action=ActionForUninstall Before='InstallFinalize'>
    Installed AND NOT UPGRADINGPRODUCTCODE
</Custom>

请让我们知道我们做错了什么。即使卸载,上面的代码也会调用 InstallFinalize。

【问题讨论】:

  • 有用的备忘单:flexerasoftware.com/webdocuments/PDF/…。我喜欢通过将 NOT PATCH 添加到现有条件列表以及 NOT UPGRADINGPRODUCTCODE 以禁用它们以进行重大升级来禁用 MSI 补丁运行的自定义操作。

标签: wix windows-installer custom-action


【解决方案1】:

通常情况下,使用未安装和 REMOVE="ALL" 等产品级属性的条件不会达到您的预期。通常最好使用组件动作状态,例如

$COMPONENTNAME=3

$COMPONENTNAME=2

这通常会涵盖您的所有安装、卸载、维护、修复、升级方案。

您可以使用“&”运算符对功能执行类似的操作,但通常使用组件“$”更好,因为组件是物理的,并且可以与一个或多个仅逻辑的功能相关联。

如果你真的想把它提升到一个新的水平,你的自定义操作可以(应该)是使用外键连接到组件表的数据驱动的。在这种情况下,您的自定义操作始终会触发,然后查询表并评估组件操作状态以确定需要安排哪些操作。

Conditional Statement Syntax (Windows)

【讨论】:

    【解决方案2】:

    你可以试试这些条件:

    安装操作:

    REMOVE <> "ALL"
    

    卸载操作

    REMOVE = "ALL"
    

    【讨论】:

    • 根据自定义操作的计划位置以及卸载的执行方式,REMOVE="ALL" 条件可能会失败。例如,当执行 /x 卸载时,立即设置 REMOVE 属性。但是在进行维护操作并选择卸载时,直到成本计算后才设置 REMOVE 属性。只是需要注意的事情。我仍然认为最好根据组件状态来创建条件。
    • @christopher 你说得有道理.. 但我们的时间很紧,我们没有任何 wix 专家.. 你所说的可能需要更多的努力来理解和实施.. 所以我们正在使用给定的解决方案通过@Cosmin
    • 请参阅我在上述问题中添加的有关重大升级和补丁安装的评论。这些安装类型使用与主要安装、维护和卸载相同的安装顺序。将您的自定义操作设置为在这些安装类型期间不运行通常是有益的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多