Как установщик wix может понизить версию файлов слияния во время обновления основной версии?
У нас есть установщик, который использует модуль слияния. Последняя версия модуля слияния включает в себя понижение до некоторых файлов. При использовании программы установки для обновления с более ранней версии у нас возникают проблемы с обновлением этих файлов.
Первоначально файлы из модуля слияния удалялись и не переустанавливались, но после прочтения основного обновления wix не устанавливаются все файлы, которые я установил Schedule='afterInstallFinalize'
на MajorUpgrade
элемент. Это привело к тому, что файлы с более новыми версиями были сохранены.
Как мы можем изменить наш установщик или модуль слияния, чтобы эти файлы были обновлены во время обновления?
1 ответ
Ну, на мой взгляд, лучший способ решить эту проблему - установить последовательность стандартного действия "RemoveExistingProducts" перед стандартным действием CostInitialize. Имейте в виду, что это расписание не соответствует рекомендации Microsoft по адресу:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa371197(v=vs.85).aspx
Поэтому, когда вы пытаетесь собрать свой MSI-пакет, вам, возможно, придется в конечном итоге подавлять сообщения об ошибках ICE, которые, если не подавлены, могут помешать вам построить. Существует простой способ подавления сообщений об ошибках ICE в Wix . Вы можете сделать это в Visual Studio IDE, а также при использовании свечи.exe для компиляции проекта.wxs. Документация Wix даст вам достаточно подробностей об этом.
Если вам интересно, можно ли идти вразрез с рекомендуемым Microsoft размещением для RemoveExistingProducts, взгляните на:
FWIW, я говорил с поддержкой MS в прошлом о наличии REP, прежде чем платить, чтобы обновления работали успешно, и в то время они сказали, что все в порядке, отметив, что это также до MigrateExistingFeatures, так что если вы переносите функции во время обновлений там ' будет проблема.
Это означает, что если у вас есть несколько функций в вашем пакете MSI и вы хотите, чтобы ваш пакет обновлений обновлял один и тот же набор функций, этот подход может не сработать. Однако, если у вас есть только одна особенность в вашем пакете MSI, то этот подход будет работать.
Также имейте в виду, что размещение RemoveExistingProducts за пределами InstallInitialize и InstallFinalize имеет другие последствия, в случае возникновения ошибки во время обновления, так как RemoveExistingProducts не обрабатывается.
Может случиться так, что RemoveExistingProducts удалит ваше старое приложение, а затем процесс обновления начнет установку новой версии вашего продукта. Однако в этот момент, если произойдет ошибка при установке новой версии вашего продукта, обновление будет отменено, и в вашей системе не останется версии продукта.
http://blogs.msdn.com/b/heaths/archive/2010/04/09/major-upgrades-with-shared-components.aspx
Другой вариант - использовать свойство REINSTALLMODE. Вы создадите это свойство в таблице свойств со значением emus REINSTALLMODE = emus.
Если emus не работает, попробуйте amus.использование amus чревато рисками и его следует избегать по большей части, за исключением исключительных обстоятельств.
https://msdn.microsoft.com/en-us/library/aa371182(v=vs.85).aspx
Тем не менее, проявляйте осторожность здесь снова.
REINSTALLMODE - это свойства вызывающего абонента, которые обычно устанавливаются лицом, выполняющим установку, и поэтому не рекомендуется создавать это в таблице свойств.
Однако могут быть такие исключительные ситуации, как ваша, которые могут потребовать от вас такого подхода.
-Другим вариантом, о котором я думал, было изменение GUID компонентов в вашем модуле слияния. Однако это будет работать только при соблюдении следующего условия:
-Все потребители вашего модуля слияния имеют последовательность RemoveExistingProducts, упорядоченную очень рано в цикле обновления, т.е. они следуют методу ugprade, при котором более старый продукт удаляется, а новый устанавливается. Таким образом, это может привести к повторному упорядочению RemoveExistingProducts у всех ваших потребителей.
Причина в том, что на минуту предположим, что вы меняете GUID компонента в текущей версии модуля слияния, а затем перестраиваете последнюю версию установщика с помощью этого модуля слияния. Если RemoveExistingProducts упорядочен позже в цикле обновления, т.е. после InstallFinalize, то это является нарушением правил компонента установщика Windows. У вас есть два продукта, устанавливающие один и тот же файл в одно и то же место, но с разными компонентами GUI. Следовательно, крайне важно, чтобы, если следовать этому подходу, RemoveExistingProducts упорядочивается очень рано в цикле обновления.
Надеюсь это поможет.