Вопрос или проблема
Я вижу изменения между Wix 3.14 и Wix 4 в моем сгенерированном MSI-файле …
У меня есть определенные свойства, которые
- Я хочу унаследовать от предыдущей установки/реестра
- Позволить человеку передавать свойства в командной строке, которые будут переопределять предыдущие настройки
- По умолчанию устанавливать какое-то другое значение, если ни одно из условий 1 или 2 не выполнено
Допустим, у меня есть config.wxi, и я определяю переменную вот так:
<?define Absent = "#-9998" ?>
Затем в product.wxs я имею:
<Property Id="MFATIMEOUT" Value="$(var.Absent)">
<RegistrySearch Id="MFATimeOutSearch" Root="HKLM" Key="$(var.BaseRegistryKey)" Name="MFATimeOut" Type="raw" />
</Property>
В Wix 3.14 это работало для установки значения, если оно не было установлено:
<SetProperty Id="MFATIMEOUT" Value="0" After="AppSearch" Condition='MFATIMEOUT="$(var.Absent)"' Sequence="first"/>
Однако в Wix 4 это не работает … что я вижу в поле редактирования -9998. (В какой-то момент для числовых значений я изменяю их и убираю знак # перед отображением в диалоговом окне установщика). Это указывает на то, что SetProperty не был вызван, потому что условие не было выполнено. Я изменил условие, установив его на '1 or (MFATIMEOUT="$(var.Absent)")'
, и оно установило значение в 0, потому что это оценивалось как истинное.
Однако в Wix 4 я могу изменить свой источник, и это будет работать, чтобы дать правильное значение, если я закодирую “сырое” условие…
<SetProperty Id="MFATIMEOUT" Value="0" After="AppSearch" Condition='MFATIMEOUT=-9998' Sequence="first"/>
Таким образом, мне нужно изменить условие, которое работало в Wix 3: 'MFATIMEOUT="$(var.Absent)"'
, на новое условие, которое работает в Wix 4: MFATIMEOUT=-9998
Мне любопытно, что изменилось, и почему то, что у меня было, больше не работает… Это как я кодировал $(var.Absent)
? Что именно?
ДОПОЛНЕНИЕ:
Также я заметил, что для этого случая, если я изменил определение $var.Absent на -9998
вместо #-9998
, то это работает. Я не могу сказать, почему изначально это было #-9998
, но только что это было так, потому что это работало… столько неясного в Wix…
Ответ или решение
С переходом с Wix 3.14 на Wix 4 разработчики заметили значительные изменения в синтаксисе и поведении, связанных с тем, как обрабатываются свойства и условия в сгенерированных MSI-файлах. Это может вызвать затруднения, особенно в сценариях, связанных с наследованием свойств из предыдущих установок, передачей параметров командной строки и установкой значений по умолчанию.
Изменения в синтаксисе и логике работы
1. Использование переменных
В Wix 3.14 вы могли использовать конструкции вроде MFATIMEOUT="$(var.Absent)"
, чтобы задать значение свойства, зависящее от определенной переменной. Однако в Wix 4 этот подход требует изменений.
Если рассмотреть вашу ситуацию, вы определили переменную в config.wxi
с помощью:
<?define Absent = "#-9998"?>
В таком случае использование:
<SetProperty Id="MFATIMEOUT" Value="0" After="AppSearch" Condition='MFATIMEOUT="$(var.Absent)"' Sequence="first"/>
Может не сработать так, как ожидалось. В Wix 4 условие MFATIMEOUT="$(var.Absent)"
не обрабатывается должным образом, что и привело к неверному значению в поле редактирования в установочном диалоге.
2. Замена синтаксиса на числовой
Как вы отметили, при изменении условия на MFATIMEOUT=-9998
все заработало. Это связано с тем, что в Wix 4 для числовых значений необходимо избегать использования строкового представления переменных при сравнении, что делает процесс более строгим и не дает возможности использовать $(var.Absent)
в качестве строкового значения.
3. Такие детали, как символ ‘#’
Смена определения переменной с #-9998
на -9998
имеет критическое значение. К символу #
восстанавливается отношение, которое Wix интерпретирует как строку, а не как число. В Wix 4 обработки условных операторов, скорее всего, стали более строгими, что соответствует более детализированной системе типов и их обработке. Если значение начинается с #
, оно интерпретируется как строка, что может вызвать некорректное поведение в числовых условиях.
Рекомендации
-
Измените определения переменных: Используйте во всех местах числовые значения:
<?define Absent = "-9998"?>
-
Используйте числовые условия: Всегда проверяйте условия с числами напрямую без использования строкового представления переменных:
<SetProperty Id="MFATIMEOUT" Value="0" After="AppSearch" Condition='MFATIMEOUT=-9998' Sequence="first"/>
-
Поддержите совместимость: Если ваш проект требует работы с предыдущими версиями Wix, рассмотрите возможность создания условий, соответствующих обеим версиям, используя дополнительные проверки или условия.
Заключение
Переход на Wix 4 потребовал изменения подхода к работе с переменными и условиями в конфигурационных файлах. Функционал стал более строгим, что, несмотря на возникшие трудности, может привести к повышению качества и надежности создаваемых установочных пакетов. Рекомендуется внимательно изучить документацию Wix 4 и протестировать изменения на вашем проекте, чтобы убедиться, что все свойства обрабатываются корректно.