2017-03-27 2 views
1

J'essaie d'installer une fonction avec la condition suivante: "INSTALLTHIS =" YES "". La propriété "INSTALLTHIS" initialement défini "NON". L'action "test_command" définit "INSTALLTHIS" aussi "OUI". La boîte de message dans "test_command2" montre que la valeur de cette propriété a été définie "OUI". Je m'attendrais à ce que "ProductFeature" soit installé parce que "INSTALLTHIS =" YES "" est vrai sauf qu'il n'est pas installé.WIX - Installation conditionnellement

<?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> 

(j'ai supprimé le XML inutiles comme les paramètres d'annuaire, ComponentGroup, Component)

Répondre

1

Ce que vous cherchez à faire ne va pas être possible. Jetez un oeil à ce answer à une question similaire. Les conditions d'entité sont évaluées avant toute autre chose. Dans votre cas, cela signifie que lorsque la condition de fonctionnalité est évaluée, INSTALLTHIS = "NO". La réponse liée fournit une solution potentielle même si je n'ai pas utilisé cette approche, dans un programme d'installation sur lequel je travaille lorsque nous avions besoin de ce comportement, notre solution consistait à passer la propriété du programme d'amorçage.

2

Le problème que vous rencontrez concerne principalement les commandes: Les conditions d'entité sont traitées lors de l'établissement des coûts (en particulier lors de l'action CostFinalize). Une fois le calcul des coûts terminé, ils n'ont plus aucun effet. Cela dit, j'éviterais d'utiliser les conditions et les niveaux de caractéristiques de cette manière, surtout avec un Level="0" impliqué. (Level = "0" n'est vraiment sûr que pour les choses qui ne changeront jamais, comme la durée de vie du système d'exploitation.)

Si vous souhaitez autoriser vos utilisateurs à installer une fonction de manière conditionnelle en passant une ligne de commande, documentez le caractéristiques de votre installateur. Ensuite, ils peuvent passer ADDLOCAL=list,of,features. Si, au lieu de cela, vous souhaitez contrôler des composants individuels sans modifier l'état d'installation des fonctionnalités, vous pouvez définir des conditions sur les composants. Mais ceux-ci sont également traités lors de l'établissement des coûts, vous devrez donc faire attention à votre séquençage. En guise de note, évitez d'utiliser une action VBScript simplement pour définir une propriété. Je suppose que c'est une simplification de votre action réelle, mais si ce n'est pas le cas, utilisez plutôt une action SetProperty. (Je recommande généralement d'éviter les actions VBScript dans tous les cas, mais changer une action plus compliquée a plus de difficultés et donc plus de risques, donc vous devrez prendre cette décision.)