基于模式 - WIX执行自定义操作

时间:2011-04-14 06:21:08

标签: wix windows-installer custom-action

我们已为我们的应用程序创建了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。

2 个答案:

答案 0 :(得分:10)

您可以尝试以下条件:

ActionForInstall:

REMOVE <> "ALL"

ActionForUninstall

REMOVE = "ALL"

答案 1 :(得分:5)

通常使用产品级属性(如未安装和REMOVE =“ALL”)的条件不符合您的预期。通常最好使用组件操作状态,例如

$ COMPONENTNAME = 3&lt; - 正在本地安装的组件

$ COMPONENTNAME = 2&lt; - 组件先前已安装,现在正在删除

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

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

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

Conditional Statement Syntax (Windows)