Плохое состояние wix
Я пытаюсь пропустить установки в следующих случаях:
- Тип ОС Windows = настольная ОС
- if HKLM\SYSTEM\CurrentControlSet\Services\MyService MYKEY= myValue
- если присутствует REG HKLM\SYSTEM\CurrentControlSet\Services\MyService = DisplayName И если HKLM \ SYSTEM \ CurrentControlSet \ Services \ MyService MYKEY отсутствует
во время установки все прошло хорошо, но во время установки моя функция отсутствует при установке.
Я делаю что-то не так, чтобы поставить условие?
<Property Id="MYKEY" Secure="yes">
<RegistrySearch Id="MyKey"
Root="HKLM"
Key="SYSTEM\CurrentControlSet\Services\MyService"
Name="mykey"
Type="raw" />
</Property>
<Property Id="MYSERVICE" Secure="yes">
<RegistrySearch Id="MYSERVICE"
Root="HKLM"
Key="SYSTEM\CurrentControlSet\Services\MyService"
Name="DisplayName"
Type="raw" />
</Property>
<Feature Id="MyFeature" Level="" Display="" Title="" Description="" AllowAdvertise="no" ConfigurableDirectory="INSTALLDIR">
<MergeRef Id="MyFeature" Primary="yes"/>
<Condition Level="0">((MsiNTProductType=1) OR
(MYKEY="MyValue") OR
(MYSERVICE="MyService" AND MYKEY=""))</Condition>
</Condition>
</Feature>
1 ответ
ПРИМЕЧАНИЕ. Мне нужно завтра проверить правильность условий, приведенных ниже, но опубликуйте то, что у меня есть, чтобы вы могли взглянуть на это без ожидания.
Когда вы хотите достичь одного из этих трех "под-условий"?
- Прервать настройку: отменить все настройки? ( LaunchConditions)
- Настроить функции: Запретить или включить установку определенных функций? ( Особенность условий)
Это различие, очевидно, имеет решающее значение - и мы должны знать, чтобы иметь возможность ответить. Ваш исходный фрагмент WiX в настоящее время показывает условия, используемые как условия функции. Я чувствую, что это не то, что вы хотите.
LaunchConditions: чтобы прервать всю настройку, если выполняется одно из этих условий, вы можете попробовать использовать записи LaunchCondition. Вместо того, чтобы создавать одно сложное условие, вы можете просто разделить их на три разные записи, каждая из которых проверяет, следует ли прервать установку, - каждая запись по своей и конкретной причине. Я предлагаю вам добавить эти записи LaunchCondition после элемента Package в исходном файле WiX:
<Condition Message="Aborting setup: Server OS required for installation.">Installed OR MsiNTProductType=1</Condition>
<Condition Message="Aborting setup: State reason for abortion.">Installed OR MYKEY="MyValue"</Condition>
<Condition Message="Aborting setup: State reason for abortion.">Installed OR (MYSERVICE="MyService" AND MYKEY="")</Condition>
Эти записи попадут в таблицу LaunchCondition вашего скомпилированного файла MSI.
LaunchConditions должен всегда иметь значение true, чтобы установка могла быть установлена / запущена.
Соответственно, Installed
Части вышеупомянутых условий предназначены для обеспечения того, чтобы условие всегда выполнялось после установки, поэтому вы не получите ситуацию, когда установка не позволит удалить себя или восстановить, потому что условие запуска не выполнено. Состояние: Installed
- всегда будет правдой, за исключением fresh install
а также major upgrades
,
ПРИМЕЧАНИЕ. Я не уверен, могут ли условия запуска вызвать проблемы во время административных установок. Я не думаю, что они делают (административная установка имеет свои собственные последовательности установки). Я буду проверять и проверять завтра. Добавление OR ACTION="ADMIN"
при выполнении административной установки должно быть выполнено условие запуска в любом окне.
Условия функции: если вы не хотите прерывать настройку, а хотите контролировать состояние установки функции на основе оценки этих условий, вам нужно использовать концепцию условий функции вместо концепции условия запуска.
Когда вы устанавливаете Feature level
в 0
в вашем источнике WiX эта функция не отображается в графическом интерфейсе пользователя и не будет установлена по умолчанию. Условие функции может изменить это и установить функцию для установки, если условие оценивается как истинное.
Вы также можете пойти другим путем и установить уровень функции на 1 по умолчанию (это должно установить функцию), а затем использовать условие функции, чтобы установить уровень функции на 0 - если вы не хотите, чтобы функция была установлена - когда условие верно.
В разделе "Быстрый макет" есть некоторые дополнительные сведения: WIX If... else условие использования реестра.
В приведенном ниже фрагменте WiX мы устанавливаем функцию для установки по умолчанию (Level="1"
) и затем мы используем условие функции, чтобы установить, что функция не устанавливается, если ее связанное условие оценивается как true (это условие, состоящее из нескольких частей). Поэтому, когда условие оценивается как истинное, мы присваиваем Level="0"
(что означает не устанавливать функцию и скрывать ее из графического интерфейса настройки):
<Feature Id="MyFeature" Level="1"> <!--Default to install feature-->
<Condition Level="0"> <!--Do not install feature if condition is true-->
((MsiNTProductType=1) OR (MYKEY="MyValue") OR (MYSERVICE="MyService" AND MYKEY="") AND (NOT ACTION="ADMIN"))
</Condition>
</Feature>
AND (NOT ACTION="ADMIN")
часть состоит в том, чтобы заставить функцию быть установленной в административной установке. Он эффективно отключает другие условия от оценки до истины, если установка выполняется в режиме административной установки - что может привести к тому, что эта функция не будет установлена во время установки администратора. Эту последнюю часть я должен проверить завтра.
ОБНОВЛЕНИЕ: Тестирование показывает, что любая функция установлена на
Level=0
по умолчанию не будет извлечен во время административной установки вообще, независимо от каких-либо условий функции, устанавливающих функцию для установки. Я предполагаю, что предварительный вывод состоит в том, чтобы не устанавливать какие-либо функцииLevel=0
, но установитьLevel=1
а затем установите ихLevel=0
с условием, которое оценивается как истинное. Таким образом, эта функция может быть скрыта при обычной установке, но все функции - со связанными файлами - извлекаются во время установки администратора.AND (NOT ACTION="ADMIN")
часть условия, кажется, не нужна. Оставив образец выше как сейчас.
Ссылки: