Как установщик 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, взгляните на:

Файл понижения в MajorUpgrade

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 упорядочивается очень рано в цикле обновления.

Надеюсь это поможет.

Другие вопросы по тегам