Така че прекарах няколко дни или нещо повече в опити да добавя изрази за „условие“ към базиран на „WiX“ инсталатор. Идеята е, че параметрите на командния ред се предават от „Burn“ (bundle) програма за стартиране, за да се посочи кои диалогови прозорци на потребителския интерфейс трябва да бъдат показани и кои функции трябва да бъдат инсталирани.

След като си поиграх с няколко сценария (всички доведоха до това, че „функциите“ не се инсталират, но файловете се копират и се правят записи в системния регистър и т.н.), успешно реализирах това, което си поставих за цел, и исках да го споделя със света в Надявам се, че мога да спестя нечия най-ценна стока - времето!

Така че започнах с две „функции“ (в този пример инсталиране на база данни и уеб приложение): -

<Feature Id="TheDatabase" Title="Database" Description="Application Database" Level="1" Display="hidden" AllowAdvertise="no" Absent="allow">
    <ComponentGroupRef Id="Database.ComponentGroup"/>
</Feature>
<Feature Id="WebApplication" Title="Website" Description="Website" Level="1" AllowAdvertise="no" Absent="allow">
    <ComponentGroupRef Id="Web.ComponentGroup"/>
    <ComponentGroupRef Id="WebFiles.ComponentGroup"/>
    <ComponentGroupRef Id="WebFiles.SubFolder1.ComponentGroup"/>
    <ComponentGroupRef Id="WebFiles.SubFolder2.ComponentGroup"/>
</Feature>

ComponentGroupRef: създава препратка към ComponentGroup в друг фрагмент

Освен това има две WiX свойства (INSTALLDATABASE и INSTALLWEBAPPLICATION) съответно, те ще бъдат предадени като trueили falseв зависимост от това какво искаме да инсталираме.

<Property Id="INSTALLDATABASE" Secure="Yes" />
<Property Id="INSTALLWEBAPPLICATION" Secure="Yes" />

Тези свойства се задават чрез командния ред чрез деклариране на името на свойството в дефиницията на пакета на пакета. Можете да видите от декларацията по-горе, че параметрите са декларирани с ГЛАВНИ БУКВИ и ‘Secure’ е зададено на ‘yes’, за да се гарантира, че са достъпни чрез командния ред.

В примера по-долу (за Msi Packages) стойностите са твърдо кодирани, но те могат да бъдат зададени чрез пакетни променливи или друга логика, която искате да приложите.

<MsiPackage Id="WebApplication" Name="WebApplication" Cache="no" Vital="yes" DisplayName="Web Application" SourceFile="FilePath.msi" Compressed="yes" ForcePerMachine="yes" Permanent="no" DisplayInternalUI="yes">
    <MsiProperty Name="INSTALLDATABASE" Value="false"/>
    <MsiProperty Name="INSTALLWEBAPPLICATION" Value="true"/>
</MsiPackage>

След като имаме нашите свойства, следващата стъпка е да добавим условни изрази към характеристиките.

За да направите това, атрибутът „Ниво“ по подразбиране на функциите трябва да бъде зададен на 0.

Това гарантира, че по подразбиране нито една от функциите не е инсталирана, след това може да се създаде условен оператор, базиран на стойността на свойствата INSTALL, за да ги зададете по време на изпълнение.

Тези елементи на условието, декларирани във всеки елемент на функция, ще зададат атрибута Level на функцията, ако условието е вярно (в този случай то ще бъде зададено на „1“, когато условието е вярно, за да се инсталира функцията).

Например:-

<Feature Id="TheDatabase" Title="Database" Description="Application Database" Level="0" Display="hidden" AllowAdvertise="no" Absent="allow">
    <ComponentGroupRef Id="Database.ComponentGroup"/>
    <Condition Level="1">
        <![CDATA[INSTALLDATABASE="True"]]>
    </Condition>
</Feature>
<Feature Id="WebApplication" Title="Website" Description="Website" Level="1" AllowAdvertise="no" Absent="allow">
    <ComponentGroupRef Id="Web.ComponentGroup"/>
    <ComponentGroupRef Id="WebFiles.ComponentGroup"/>
    <ComponentGroupRef Id="WebFiles.SubFolder1.ComponentGroup"/>
    <ComponentGroupRef Id="WebFiles.SubFolder2.ComponentGroup"/>
    <Condition Level="1">
        <![CDATA[INSTALLWEBAPPLICATION="True"]]>
    </Condition>
</Feature>

По този начин всяка функция се инсталира само ако стойността на свойството е зададена на TRUE или FALSE чрез командния ред.

Моля, обърнете внимание: стойността на свойствата за оценка в тези изрази за условие трябва да бъде зададена преди InstallExecuteSequence на CostFinalize. Ако промените стойността на свойството във вашия потребителски интерфейс (например), това няма да повлияе на резултата от условията.

Елементите Condition могат да бъдат наистина мощен начин за персонализиране на процеса на инсталиране, надявам се тази статия да помогне на някого!