Wix - условная установка функций на основе переключателей

В настоящее время я изучаю инструмент WiX для настройки пакетов MSI для программных приложений, которые у нас есть, где я работаю.

Одна из вещей, которые я хотел сделать в процессе установки, - предложить выбор конкретного файла для установки, и я собирался открыть диалоговое окно со списком переключателей, чтобы позволить пользователю выбрать необходимую опцию.,

Вот файл WXS, который я использую

<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi' xmlns:iis='http://schemas.microsoft.com/wix/IIsExtension'>
  <Product Id='E22E3B45-CFA6-4F4E-9D37-AA95A3684522' Name='Test Install' Language='1033'
           Version='1.0.0.0' Manufacturer='Microsoft Corporation' UpgradeCode='E22E3B45-CFA6-4F4E-9D37-AA95A3684522'>
    <Package Description='Test Installer Package'
              Comments='Install Test'
              Manufacturer='Microsoft Corporation' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='testinstall.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='dir_temp' Name='Temp'>
        <Component Id='component_dir_root1' Guid='A51094B8-552F-49C4-9E5C-36815D471913'>
          <File Id='file_readme.txt' Name='readme.txt' DiskId='1' Source='root/readme.txt' />
        </Component>
        <Component Id='component_dir_root2' Guid='A51094B8-552F-49C4-9E5C-36815D471914'>
          <File Id='file_readme2.txt' Name='readme2.txt' DiskId='1' Source='root/readme2.txt' />
        </Component>
      </Directory>
    </Directory>

    <Feature Id='feature_test' Title='Test Features' Level='1'>
      <Feature Id='feature_dir_root1' Level='1'>
        <ComponentRef Id='component_dir_root1' />
        <Condition Level="0"><![CDATA[RootType <> "1"]]></Condition>
      </Feature>
      <Feature Id='feature_dir_root2' Level='1'>
        <ComponentRef Id='component_dir_root2' />
        <Condition Level="0"><![CDATA[RootType <> "2"]]></Condition>
      </Feature>
    </Feature>

    <UI>
      <Property Id="DefaultUIFont">DlgFont8</Property>

      <Dialog Id="InstallDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
    <Control Id="Buttons" Type="RadioButtonGroup" X="20" Y="187" Width="330" Height="40" Property="RootType" />

        <Control Id="Install" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Text="Install">
          <Publish Event="EndDialog" Value="Return" />
        </Control>
      </Dialog>

      <RadioButtonGroup Property="RootType">
        <RadioButton Text="{\DlgFont8}Root 1"
          Value="1" X="5" Y="0" Width="250" Height="15" />
        <RadioButton Text="{\DlgFont8}Root2"
          Value="2" X="5" Y="20" Width="250" Height="15" />
      </RadioButtonGroup>

      <TextStyle Id="DlgFont8" FaceName="Tahoma" Size="8" />

      <InstallUISequence>
        <Show Dialog="InstallDlg" After="CostFinalize" />
      </InstallUISequence>
    </UI>

    <Property Id="RootType">2</Property>
  </Product>
</Wix>

Итак, есть две особенности. Каждый соответствует отдельному компоненту, представляющему файлы. Переключатели ссылаются на свойство RootType, которое я хочу контролировать, какая функция установлена.

Диалоговое окно отображается нормально, и если я изменяю значение по умолчанию для RootType, правильный переключатель всегда проверяется при отображении формы установки. Однако, если во время установки пользователь выберет другую радиокнопку, это фактически не повлияет на то, какой файл будет установлен. Установленный файл всегда тот, который установлен в качестве начального значения свойства RootType.

Есть ли что-то еще, что нужно сделать, чтобы переключатели обновляли свойство перед установкой функций?

3 ответа

Решение

К тому времени, когда ваши диалоги показываются, уже слишком поздно устанавливать свойства, чтобы влиять на условия объекта против INSTALLLEVEL. Вместо этого вы должны поместить Control Events на кнопку Next (или аналогичную) в диалоговом окне с переключателями, которые используют AddLocal или Remove, чтобы контролировать, установлена ​​ли функция.

У меня была та же самая проблема в течение нескольких дней. Я нашел много примеров условных выражений в сети, всегда заканчивая одной и той же проблемой. Прочитав ответ Майкла Урмана, я решил выяснить, что именно он имел в виду под "... Вместо этого вы должны поместить Control Events на кнопку Next (или аналогичную) в диалоге с переключателями, которые используют AddLocal или Remove для управления тем, будет ли функция устанавливается."

Вот оно:

Не помещайте операторы условий в функции. Избавься от них. Вместо этого проверьте значения переключателей в элементе управления кнопки! В вашем случае кнопка Установить.

Пример:

      <Control Id="Install" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Text="Install">
        <!--Check button values here:-->
        <Publish Event="AddLocal" Value="ALL">1</Publish>
        <Publish Event="Remove" Value="feature_dir_root1">RootType = 1</Publish>
        <Publish Event="Remove" Value="feature_dir_root2">RootType = 2</Publish>
        <Publish Event="EndDialog" Value="Return" />
      </Control>

Я нашел статью, которая объясняет немного больше всего этого, а также событие AddLocal Publish Event. Вам это тоже нужно, так что не удаляйте его!

Итак, еще раз, значение, связанное с переключателями, фактически проверяется при нажатии кнопки Install. Вот и все в принципе.

Это действительно установит функцию, основанную на переключателе, выбранном пользователем. Надеюсь, это поможет!

В дополнение к ответу @dankmemester приведенный ниже код отлично работает в Wix 3.11, для него требуется последовательность «Заказ».

              <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" >
            <Publish Event="EndDialog" Value="Return" Order='20'/>
            <Publish Event="ADDLOCAL" Value="ALL" Order='10' />
            <Publish Event="Remove" Value="QC_ALT_Feature" Order='11'>QC_TYPE="2"</Publish>
            <Publish Event="Remove" Value="QC_STD_Feature" Order='11'>QC_TYPE="1"</Publish>
        </Control>
Другие вопросы по тегам