2009-07-21 15 views
14

Próbuję zrobić prosty Windows Intaller, i nie wiem jak sobie z tym poradzić. Mam dwie funkcje - feature1 i feature2. Chcę, aby funkcja 2 była instalowana tylko wtedy, gdy użytkownik wybrał funkcję 1, która ma zostać zainstalowana. Tak więc próbowałem:Jak korzystać z warunków w funkcjach WiX?

<Feature Id='core' Title='Core' 
     Description='ØMQ 1.0.0 core functionality and C++ API' Level='1'> 
    <ComponentRef Id='Core_include' /> 
    <ComponentRef Id='Core_bin' /> 
    <ComponentRef Id='Core_lib' /> 
    <ComponentRef Id='Core_zmq' /> 
    <ComponentRef Id='cpp_bin' /> 
</Feature> 

<Feature Id='core_perf' Title='core_perf' Description='0MQ core perf' Level='999'> 
    <Condition Level="0">NOT (&amp;core = "3")</Condition> 
     <ComponentRef Id='cpp_perf' /> 
</Feature> 

Ale to nie instaluje funkcji core_perf, jeśli użytkownik wybierze rdzeń operacji.

Jak mogę to naprawić?

+0

Według ścisłego znaczenia "tylko jeśli" brzmi jak cecha1, a cecha2 to właściwie tylko jedna cecha. Czy naprawdę masz na myśli, że funkcja 2 powinna być dostępna tylko po zainstalowaniu cechy 1? – Jared

+0

Tak, zgadza się. Chcę, aby funkcja2 była instalowana TYLKO JEŚLI funkcja 1 jest zainstalowana. –

+0

Aby wyjaśnić - moja aplikacja ma kilka różnych funkcji, a następnie mam przykład sekcji pokazujący przykłady użycia tych funkcji. Chcę, jeśli ktoś wybierze "feature1" i będzie miał "przykłady" (składa się z przykładów wszystkich funkcji), wtedy chcę, aby funkcja "feature1_examples" została zainstalowana. –

Odpowiedz

14

Musisz przenieść swój stan do definicji komponentu i użyj! (Stan Feature) zamiast & (działanie Feature), tak, że działa przy próbie dodania przykłady przez ponowne uruchomienie instalacji po raz drugi:

<Component Id="example1"> 
    <Condition>!feature1 = 3</Condition> 
</Component> 

<Component Id="example2"> 
    <Condition>!feature2 = 3</Condition> 
</Component> 

<Feature Id="feature1"> 
</Feature> 

<Feature Id="feature2"> 
</Feature> 

<Feature Id="examples"> 
    <ComponentRef Id="example1" /> 
    <ComponentRef Id="example2" /> 
</Feature> 
+3

Gdzie jest to udokumentowane? Stan funkcji =! i Działanie funkcji = &. – Cheeso

+10

http://msdn.microsoft.com/en-us/library/aa368012(VS.85).aspx http://www.tramontana.co.hu/wix/lesson6.php#6.2 – Jared

+0

To może być dobre z niektórymi komponentami, ale trudne do zarządzania, jeśli masz dużą liczbę komponentów. –

6

myślę, że byłoby najlepiej, gdyby Feature1 były rodzic of feature2. Następnie nie można zainstalować feature2, chyba że zostanie również zainstalowany element1. Żadne warunki nie są konieczne.

<Feature Id='core' Title='Core' 
     Description='ØMQ 1.0.0 core functionality and C++ API' Level='1'> 
    <ComponentRef Id='Core_include' /> 
    <ComponentRef Id='Core_bin' /> 
    <ComponentRef Id='Core_lib' /> 
    <ComponentRef Id='Core_zmq' /> 
    <ComponentRef Id='cpp_bin' /> 
    <Feature Id='core_perf' Title='core_perf' Description='0MQ core perf' 
      Level='999'> 
     <ComponentRef Id='cpp_perf' /> 
    </Feature> 
</Feature>