MSI не устанавливает все файлы при выполнении RemovePreviousVersion
У меня есть сборка MSI с использованием WiX версии 3.
Все предыдущие установщики для продукта, который мы развертываем, отлично работали с указанной конфигурацией (то есть: если предыдущая версия существует, удалите, затем установите новую версию), однако новые MSI, которые мы создаем, не устанавливают все файлы, когда он проходит через путь "удалить первый".
Если мы вручную удалим существующую установку, а затем запустим новую версию, все файлы будут установлены - и когда я исследую файл MSI в Orca, файлы и функции показываются и кажутся прекрасными.
Мы попробовали работать с подробным и дополнительным протоколированием (/l*vx
), однако все мы видим, что файлы не регистрируются и не устанавливаются.
Любые мысли или предложения? Это ведет нас к стене.
Ответы
Ответ 1
Хорошо, хорошо поговорить с кем-то еще, где я помог мне найти решение проблемы.
Мы добавили свойство REINSTALLMODE
и установили его в amus
. Что это значит?
По умолчанию свойство имеет значение omus
, что означает: Переустановить, если файл отсутствует или старше, переписать реестр для машинных и пользовательских ульев, переустановить ярлыки. Изменение этого параметра на amus
в основном говорит: Переустановите все файлы.
Итак, на 100% не уверен, в чем причина: я подозреваю, что, возможно, были странные блокировки или что-то в этом роде, но установка на amus
не влияет на какие-либо побочные эффекты, поэтому мы будем придерживаться этого.
Спасибо за предложения.
(Более подробную информацию об этом свойстве можно найти здесь: MSDN: свойство REINSTALLMODE
Ответ 2
В соответствии с пользовательской последовательностью действий по умолчанию установщик Windows определяет, какие файлы необходимо установить/перезаписать перед удалением любых существующих версий программного обеспечения. Установщик Windows использует значение свойства REINSTALLMODE, чтобы сообщить ему, как принимать решения о замене файлов. Если REINSTALLMODE содержит "o", то он будет устанавливать только файлы, где версия отличается или файл еще не существует; файлы без версий будут установлены, только если Модифицированная дата файла равна <= Дата создания (т.е. файл не изменяется). Если REINSTALLMODE содержит "a", он всегда будет устанавливать файл независимо от любой версии или даты, прикрепленной к существующим файлам.
Что происходит в вашем сценарии, скорее всего, следующее:
- Установщик Windows определяет, какие файлы необходимо установить. Он решает, что некоторые файлы не нужно устанавливать (возможно, потому, что они уже существуют и имеют такие же или более новые версии, что и в MSI).
- Удалена предыдущая версия программного обеспечения, в том числе файлы, установленные установщиком Windows, не обязательно должны быть установлены.
- Установщик Windows устанавливает файлы для новой установки, но не устанавливает файлы, которые он определил, не нужно устанавливать.
Конечный результат заключается в том, что после обновления программного обеспечения отсутствует куча файлов. Установка REINSTALLMODE = amus вместо omus скорее всего устранит вашу проблему, но вы должны убедиться, что знаете, как это влияет на остальную часть вашей установки. Если есть файлы, которые вы не хотите перезаписывать, вам нужно будет пометить эти компоненты на "Never Overwrite".
Ответ 3
Как выглядит ваш шаг <RemoveExistingProducts After="">
? Возможно, что removeexisting работает после установки - и удаляет все файлы, которые были одинаковыми в предыдущей и текущей версиях.
У меня установлен мой установщик <RemoveExistingProducts After="InstallInitialize">
, чтобы убедиться, что это сделано раньше всего. Я не знаю, правильно это или нет, но, похоже, это работает.
<Upgrade Id="$(var.UpgradeCode)">
<!--Upgrade code found at http://www.nichesoftware.co.nz/blog/200809/upgradable-msi-installations-with-wix -->
<!-- Detect any newer version of this product-->
<UpgradeVersion Minimum="$(var.version)" IncludeMinimum="no" OnlyDetect="yes" Language="1033" Property="NEWPRODUCTFOUND" />
<!-- Detect and remove any older version of this product-->
<UpgradeVersion Maximum="$(var.version)" IncludeMaximum="yes" OnlyDetect="no" Language="1033" Property="OLDPRODUCTFOUND" />
</Upgrade>
<CustomAction Id="PreventDowngrading" Error="Newer version already installed"></CustomAction>
<InstallExecuteSequence>
<!-- Prevent Downgrading-->
<Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
<InstallUISequence>
<!-- Prevent Downgrading-->
<Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
</InstallUISequence>