Как условно исключить функции из «FeaturesDlg» в WiX 3.0 из управляемого настраиваемого действия (DTF) - PullRequest
4 голосов
/ 30 апреля 2010

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

Я вижу, что если я установлю атрибут Display для Feature в hidden в файле .wxs, он будет делать то, что я хочу, но я не могу найти способ изменить этот атрибут во время выполнения .

Любые указатели были бы великолепны.

Редактировать

Я пытался использовать SQL для обновления базы данных сеанса, но хотя я действительно могу удалить функцию, используя DELETE FROM Feature WHERE Feature = 'featureId', если я пытаюсь использовать UPDATE Feature SET Display=0 WHERE Feature='featureId', я получаю ошибку UPDATE FAILED. Если я пытаюсь установить для значения Display значение, отличное от того, на котором оно уже установлено, я получаю эту ошибку.

Удаление функции ПОЧТИ достаточно хорошо, но мне нужно было бы иметь возможность вернуться и повторно добавить функцию, если пользователь вернется назад и изменит некоторые входные данные.

Ответы [ 3 ]

3 голосов
/ 21 октября 2010

Мне нужно было сделать то же самое и найти это ...

Создайте свойство .. которое будет установлено ЦС или чем-то еще ...

  <Property Id='INSTALL_FEATURE_2'>YES</Property>

Тогда используйте свойство внутри вашей функции ...

  <Feature Id='ASecondFeature' Title='Feature 2' Level='1'>
    <Condition Level='0'>INSTALL_FEATURE_2 = "NO"</Condition>
    <ComponentGroupRef Id='secondComponent'/>  
  </Feature>

обратите внимание, что условие dosent напрямую устанавливает, установлен ли родительский элемент, как с файлами и т. П., Устанавливает атрибут уровня родительской функции. Установка его в 0 делает его скрытым ... вуаля!

2 голосов
/ 02 марта 2011

Приведенный выше пример является правильным способом условного предложения функции (за исключением того, что рекомендуется, чтобы условие было в разделе CDATA), однако, поскольку вы сказали, что хотите решить это в своем пользовательском действии ...

С учетом такой функции:

<Feature Id="MyFeature" Title="My Title" Level="1" >
  <Condition Level="0"><![CDATA[NOT(INSTALLMYFEATURE~="TRUE")]]></Condition>
  <ComponentGroupRef Id="MyFeatureComponentGroup" />
</Feature>

В вашем управляемом настраиваемом действии вы получаете объект «Сеанс». Если вы хотите сделать функцию доступной для пользователя, установите для свойства INSTALLMYFEATURE значение «True», в противном случае установите для него значение «False».

session["INSTALLMYFEATURE"] = "True";

или

session["INSTALLMYFEATURE"] = "False";
2 голосов
/ 01 мая 2010

Ну, я думаю, что нашел решение случайно. После нескольких экспериментов я наткнулся на сообщение об ошибке от MSI, которое как бы описывает некоторые столбцы для таблицы Feature в текущем сеансе, и был столбец «RuntimeLevel», который не описан ни в одной документации, которую я смог найти. Итак, я попробовал это:

session.Database.Execute("UPDATE Feature SET RuntimeLevel=0 WHERE Feature='MyFeature'");

И это сработало; функция больше не была указана в SelectionTree. Затем я снова выполнил тот же запрос с RuntimeLevel = 1, и он снова появился в списке.

Поскольку я не уверен, есть ли какие-либо странные последствия для этого решения, я оставлю вопрос на некоторое время открытым, на случай, если у кого-то еще есть "лучшее" решение.

...