WIX - 有条件地安装功能

WIX - Install feature conditionally

我正在尝试安装满足以下条件的功能:"INSTALLTHIS="YES""。 属性"INSTALLTHIS"初始设置"NO"。操作 "test_command" 也设置 "INSTALLTHIS" "YES"。 "test_command2" 中的消息框显示此 属性 的值已设置 "YES"。我希望 "ProductFeature" 会被安装,因为 "INSTALLTHIS="YES"" 是真的,除非它没有被安装。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="*" Name="test" Language="1033" Version="1.0.0.0" Manufacturer="test_wix" UpgradeCode="351b96ea-a1af-4542-8be9-9e8e07878a99">
        <Property Id="INSTALLTHIS" Value="NO" Secure="yes"></Property>

        <Feature Id="ProductFeature" Title="SetupProject1" Level="0"> 
            <ComponentRef Id="ClientSoftware" />        
            <Condition Level="1">
                <![CDATA[INSTALLTHIS="YES"]]>
            </Condition>
        </Feature>

        <CustomAction Id="test_command" Script="vbscript">
            <![CDATA[          
                Session.Property("INSTALLTHIS") = "YES"
            ]]>
        </CustomAction>

        <CustomAction Id="test_command2" Script="vbscript">
            <![CDATA[          
                MsgBox(Session.Property("INSTALLTHIS")) <!-- SAYS YES IN THE MESSAGE BOX -->
            ]]>
        </CustomAction>

    <InstallExecuteSequence>
            <Custom Action="test_command" After="CostFinalize">NOT Installed</Custom> 
            <Custom Action="test_command2" After="test_command">NOT Installed</Custom>
    </InstallExecuteSequence>
</Product>

(我删除了不必要的XML,比如目录设置、ComponentGroup、Component)

你想做的事不可能实现。看看这个 answer 的类似问题。首先评估特征条件,然后再进行其他评估。在您的情况下,这意味着当评估功能条件时 INSTALLTHIS = "NO"。链接的答案提供了一个潜在的解决方案,尽管我没有使用过这种方法,在我工作的安装程序中,当我们需要这种行为时,我们的解决方案是从引导程序传递 属性。

您遇到的问题主要是排序问题之一:要素条件是在 Costing 期间处理的(特别是在 CostFinalize 操作期间)。一旦成本核算完成,它们就没有进一步的影响。也就是说,我会避免以这种方式使用特征条件和级别,尤其是涉及 Level="0" 时。 (Level="0" 实际上只对永远不会改变的东西是安全的,比如操作系统的位数。)

如果您希望允许您的用户通过传递命令行有条件地安装某项功能,请记录您的安装程序的功能。然后他们可以通过ADDLOCAL=list,of,features。相反,如果您想在不更改功能的安装状态的情况下控制单个组件,则可以在组件上设置条件。但这些也会在成本核算期间进行处理,因此您仍然需要注意排序。

附带说明一下,避免仅使用 VBScript 操作来设置 属性。我认为这是对您实际操作的简化,但如果不是,请改用 SetProperty 操作。 (我通常建议在所有情况下都避免使用 VBScript 操作,但更改更复杂的操作难度更大,因此风险更大,因此您必须做出该决定。)