Добавление модуля слияния в проект Wix приводит к сбою обновления
Итак, у меня есть установщик продукта, созданный с использованием WiX, который не может корректно обновиться после включения модуля слияния "Microsoft_VC100_CRT_x86.msm". Старый продукт не удаляется во время установки. Если модули слияния удаляются из проекта, удаление старой версии происходит должным образом.
Модуль слияния довольно просто включен в узел каталога:
<Directory Id="ProgramFilesFolder">
<Merge Id="VC10_CRT_MergeId1" Language="0" SourceFile="c:\\Program Files (x86)\\Common Files\\Merge Modules\\Microsoft_VC100_CRT_x86.msm" DiskId="1" />
... other stuff
</Directory>
а затем упоминается в функциях:
<Feature Id="MainFeature" Title="Core Files" Level="1">
<MergeRef Id="VC10_CRT_MergeId1" />
... other stuff
</Feature>
Я увеличиваю номер версии продукта, но обновления не происходит, и новая версия устанавливается поверх старой версии, но без выполнения правильного обновления - обе версии перечислены в "Установка и удаление программ".
Старый продукт должен быть удален следующим образом:
<InstallExecuteSequence>
<RemoveExistingProducts After='InstallValidate'/>
</InstallExecuteSequence>
Я также пробовал различные другие позиции для RemoveExistingProducts согласно http://jpassing.com/2007/06/16/where-to-place-removeexistingproducts-in-a-major-msi-upgrade/, с теми же результатами.
В подробном журнале для установщика видно следующее:
MSI (s) (AC:44) [19:48:22:300]: Doing action: RemoveExistingProducts
MSI (s) (AC:44) [19:48:22:300]: Note: 1: 2205 2: 3: ActionText
Action start 19:48:22: RemoveExistingProducts.
MSI (s) (AC:44) [19:48:22:300]: Note: 1: 2205 2: 3: Error
MSI (s) (AC:44) [19:48:22:300]: Note: 1: 2228 2: 3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 22
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2205 2: 3: Error
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2228 2: 3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 23
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2205 2: 3: Error
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2228 2: 3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 16
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2205 2: 3: Error
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2228 2: 3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 21
Action ended 19:48:22: RemoveExistingProducts. Return value 1.
В журнале сборки WiX я получаю следующее (но из памяти это нормально с msms времени выполнения VC?):
1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 1 in the table InstallExecuteSequence
1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 1 in the table InstallUISequence
1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 3 in the table AdminExecuteSequence
1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 3 in the table AdminUISequence
1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 3 in the table AdvtExecuteSequence
InstallExecuteSequence в MSI выглядит следующим образом:
Если модуль слияния удален (его необходимо включить из-за обновленных файлов в установщике), тогда обновление работает, как и ожидалось. Это ошибка в модуле слияния вещи /WiX/Windows Installer, или я делаю что-то не так?
2 ответа
Вы не получаете никаких сообщений об ошибках при обновлении? Проходит, но у вас остались две записи Добавить / Удалить и испорченная файловая система? Похоже, ваши две версии не используют один и тот же код обновления.
Если вы пытаетесь выполнить незначительное обновление, RemoveExistingProducts не будет запущено. Файлы должны быть обновлены, но у вас останется одна запись Добавить / Удалить.
Если вы пытаетесь выполнить серьезное обновление, которое вызовет RemoveExistingProducts, но вам необходимо правильно настроить элемент Upgrade.
Также, как совет, не используйте модули слияния. Из-за того, как работают правила для компонентов установщика Windows, при незначительном обновлении вы не можете удалить компоненты, добавленные модулем слияния. Вам нужно будет ввести серьезное обновление. (Или вручную добавьте все коды компонентов из старого модуля слияния в ваш проект. Не интересно.) В зависимости от того, как настроены все ваши компоненты, принудительное обновление может стать большой проблемой.
Вы столкнетесь с этим, если добавите модуль слияния, а затем его необходимо удалить. Или, если вы хотите заменить, скажем, модуль VS 2010 на модуль VS 2012. MS даже однажды нарушила правила компонентов между пакетами обновлений. Гораздо проще установить их, запустив vcredist*.exes во время или до установки вашего продукта.
Вы уже нашли проблему? Проверьте, является ли версия добавляемых вами модулей слияния более старой, чем та, которая уже существует в устанавливаемой вами системе. В этом случае MSI удалял файлы VC++, но не записывал новые, потому что они были старше.
Изменить: я нашел решение вашей проблемы! Вы должны использовать: RemoveExistingProducts After="InstallFinalize
У меня была та же проблема, и я решил ее исправить.