Синтаксис/условные изменения Wix4

Вопрос или проблема

Я вижу изменения между Wix 3.14 и Wix 4 в моем сгенерированном MSI-файле …

У меня есть определенные свойства, которые

  1. Я хочу унаследовать от предыдущей установки/реестра
  2. Позволить человеку передавать свойства в командной строке, которые будут переопределять предыдущие настройки
  3. По умолчанию устанавливать какое-то другое значение, если ни одно из условий 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 обработки условных операторов, скорее всего, стали более строгими, что соответствует более детализированной системе типов и их обработке. Если значение начинается с #, оно интерпретируется как строка, что может вызвать некорректное поведение в числовых условиях.

Рекомендации

  1. Измените определения переменных: Используйте во всех местах числовые значения:

    <?define Absent = "-9998"?>
  2. Используйте числовые условия: Всегда проверяйте условия с числами напрямую без использования строкового представления переменных:

    <SetProperty Id="MFATIMEOUT" Value="0" After="AppSearch" Condition='MFATIMEOUT=-9998' Sequence="first"/>
  3. Поддержите совместимость: Если ваш проект требует работы с предыдущими версиями Wix, рассмотрите возможность создания условий, соответствующих обеим версиям, используя дополнительные проверки или условия.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...