Удалите несколько продуктов с помощью пользовательских действий - PullRequest
4 голосов
/ 18 ноября 2011

Я разрабатываю основанный на WIX Instler для нашего продукта, который имеет базовый продукт и множество плагинов.База и плагин будут поставляться как отдельные MSI.Плагины могут быть установлены только при наличии базы.База и плагины совместно используют общее дерево папок в папке ROOT, например «C: \ Program files \ MyProduct».

Я использую пользовательские действия для удаления всех зависимых плагинов.Но плагины не удаляются должным образом.Это очень случайно.Несколько раз три плагина были удалены, а иногда только два плагина.Но я могу удалить плагины отдельно от «Установка и удаление программ».

Я использую следующие пользовательские действия ...

<Fragment>
    <CustomAction Id='UninstallP1Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p1.log" Execute='immediate' Return='asyncNoWait' />
    <CustomAction Id='UninstallP2Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p2.log" Execute='immediate' Return='asyncNoWait' />
    <CustomAction Id='UninstallP3Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p3.log" Execute='immediate' Return='asyncNoWait' />
    <CustomAction Id='UninstallP4Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p4.log" Execute='immediate' Return='asyncNoWait' />
    <CustomAction Id='UninstallP4Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p4.log" Execute='immediate' Return='asyncNoWait' />

</Fragment>

Я называю этот CA в моем скрипте продукта как ...

       <!--Uninstall Plug-ins -->
        <Custom Action='UninstallP1Action' After='InstallFinalize'>(REMOVE="ALL")</Custom>
        <Custom Action='UninstallP2Action' After='UninstallP1Action'>(REMOVE="ALL")</Custom>
        <Custom Action='UninstallP3Action' After='UninstallP2Action'>(REMOVE="ALL")</Custom>
        <Custom Action='UninstallP4Action' After='UninstallP3Action'>(REMOVE="ALL")</Custom>
        <Custom Action='UninstallP5Action' After='UninstallP4Action'>(REMOVE="ALL")</Custom>

Мои вопросы здесь

  1. Как выполнить чистую деинсталляцию всех плагинов при удалении базы?

  2. Журналы не создаются, если плагин отсутствует при удалении.Но журнал создан успешно, когда плагин удален правильно.Как это проверить?

  3. Я знаю о создании функций (для разных плагинов) в рамках одного MSI.Но мы планируем поставлять плагины как отдельные MSI.Любой другой возможный способ, доступный в WiX?

Любая помощь будет очень признательна!

1 Ответ

6 голосов
/ 18 ноября 2011

Как выполнить чистое удаление всех плагинов при удалении базы?

Ваши пользовательские действия по удалению не ждут возврата.Таким образом, они в основном запускают команды удаления одну за другой, не дожидаясь завершения каждого процесса.

Установщик Windows не поддерживает две последовательности InstallExecuteSequence, запущенные одновременно.Таким образом, два процесса удаления не могут выполняться одновременно.Поскольку вы запускаете несколько процессов удаления одновременно, некоторые из них завершаются неудачно.

Решение использует BAT-файл для выполнения команд удаления.Он ожидает завершения каждой команды перед запуском следующей.Недостатком является то, что вы не можете легко удалить эту BAT с целевой машины после завершения удаления.

Нет журналов, созданных, когда плагин отсутствует при удалении.Но журнал создан успешно, когда плагин удален правильно.Как это проверить?

Установщик Windows автоматически обнаруживает конфликтующие процессы установки или удаления.Таким образом, удаление вашего плагина завершается неудачно, прежде чем он начинает писать журнал.

Я знаю о создании функций (для разных плагинов) в рамках одного MSI.Но мы планируем поставлять плагины как отдельные MSI.Есть ли другой возможный способ в WiX?

Не совсем.

...