Wix - условная установка функций на основе переключателей - PullRequest
2 голосов
/ 17 февраля 2012

В настоящее время я изучаю инструмент 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 .

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

Ответы [ 2 ]

3 голосов
/ 18 февраля 2012

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

2 голосов
/ 14 октября 2016

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

Вот так:

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

Пример:

      <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.Вам это тоже нужно, так что не удаляйте его!

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...