Настраиваемое действие только при установке, но не при обновлении и не при удалении

Я использую Wix 3.8.

Сначала я создаю установщик (.msi), который выполняет настраиваемое действие во время процесса установки (для целей тестирования он показывает только сообщение):

Элемент продукта:

<Product Id="PUT-GUID-HERE" Name="MyProduct" 
         Version="1.0.1.100" Manufacturer="Foobar Company"
         UpgradeCode="PUT-GUID-HERE">

Пользовательское действие

<CustomAction Id="Message1" Script="vbscript">
<![CDATA[
MsgBox("First Install?")
]]>
</CustomAction>

<InstallExecuteSequence>
<Custom Action="Message1" 
        Before="InstallInitialize">NOT Installed AND NOT REMOVE</Custom>

Теперь, когда я запускаю свой файл .msi, в моей установке будет отображаться сообщение:

окно сообщения

Затем я изменяю код продукта и увеличиваю номер версии, чтобы создать обновление:

Элемент продукта:

<Product Id="PUT-GUID-HERE" 
         Name="MyProduct" Version="1.0.2.100" 
         Manufacturer="Foobar Company" 
         UpgradeCode="PUT-GUID-HERE">

Что касается условия NOT Installed AND NOT REMOVE, я ожидаю, что окно сообщения не появится, когда я выполню обновление. Но это действительно так:

окно сообщения

Каково правильное условие для настраиваемого действия, которое будет выполняться только при установке, но не при обновлении?


person Simon    schedule 05.09.2014    source источник


Ответы (2)


Наконец, он работает со следующим условием:

NOT (WIX_UPGRADE_DETECTED OR UPGRADINGPRODUCTCODE) AND NOT (REMOVE="ALL")

Используя это условие, мое действие реагирует только на установку, но не на обновление и не на удаление.

Важно: MSI-файл как установщика, так и обновления должен содержать это условие.

person Simon    schedule 05.09.2014
comment
Это условие может быть неправильным, потому что оно не включает ремонт, и обратите внимание, что, несмотря на то, что вы, возможно, слышали, вы не можете гарантировать, что никогда не получите ремонт. IMO условие, которое вам нужно, - это просто старый добрый Not Installed. Тогда он больше никогда не запустится. - person PhilDW; 06.09.2014
comment
@PhilDW: Ваше предложение с "Не установлено" неверно. Когда я сделаю обновление, действие будет выполнено → Я тестировал. - person Simon; 08.09.2014
comment
Что значит обновление? Во время исправления, серьезного обновления, исправления и незначительного обновления свойство Установлено всегда устанавливается, потому что продукт, определенный этим ProductCode, все еще установлен. Я использовал его таким образом много раз, поэтому в вашем обновлении может быть что-то другое. - person PhilDW; 09.09.2014

Будьте осторожны с условиями для настраиваемых действий, их сложно сделать правильно. Вот Шпаргалка по условиям MSI чтобы помочь вам. Я не тестировал эти условия - тестирование - единственная гарантия. Вот еще один лист с более подробной информацией (рекомендуется).

Вот интересный пост: Как добавить настраиваемое действие WiX, которое выполняется только при удалении (через MSI)?

Ваше предложенное условие выглядит нормально, но посмотрите на лист. Также - патч имеет специфичные для патча свойства, такие как PATCH и MSIPATCHREMOVE. Используйте эти условия для настраиваемых действий, чтобы они запускались или не запускались во время исправления, в зависимости от того, что необходимо. Если вы планируете использовать исправления, вы должны настроить свои пользовательские действия так, чтобы они не выполнялись во время установки исправлений, на мой взгляд.

Я удалил для вас жестко запрограммированные руководства. Будьте осторожны при размещении руководств - с простым копированием и вставкой ваши уникальные направляющие уже не так уникальны. Настоящие проблемы могут возникнуть из-за всех жестко запрограммированных руководств.

person Stein Åsmul    schedule 05.09.2014