Wix/MSI - Как избежать установки одного и того же MSI дважды

У меня есть мой установщик, закодированный на языке WiX. Он поддерживает основной механизм обновления. Особое требование состоит в том, что тот же файл MSI не будет доступен для установки дважды.

Теперь возникает сложная часть: если пользователь установит, а затем попытается установить его снова (режим пользовательского интерфейса), установщик входит в режим обслуживания, и все работает нормально (изменение/восстановление будет отключено.)

Однако при установке в нашем случае использования в бесшумном режиме

msiexec.exe/i installer.msi/qn

Вторая установка продолжит установку как обычно (мы этого не хотим!)

Некоторые вещи, о которых нужно заметить, следующие:

В файле журнала второй установки последовательность " FindRelatedProducts" будет пропущена (как указано в документации Microsoft http://msdn.microsoft.com/en-us/library/windows/desktop/aa368600(v=vs.85).aspx)

Также я немного разбираюсь в http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/UpgradeVersion-is-not-detecting-the-same-version-preventing-downgrades-td5875840.html, там есть хорошая информация, утверждая, что для этих сценариев мы можем использовать свойство Installed, чтобы определить, Продукт уже установлен...

Тем не менее, я застрял здесь: потому что мне нужно избегать установки предыдущих или тех же версий, что и текущий, и повышения производительности. Как я могу добиться этого в WiX?

Спасибо за вашу помощь!

Ответ 1

Это невозможно.

При попытке установить уже установленный пакет установщик Windows автоматически выполняет ремонт. Процесс обновления отсутствует.

Кроме того, процесс обслуживания запускается на основе ProductCode. При запуске вашего пакета второй раз, когда установщик Windows видит, что его ProductCode уже установлен и входит в режим обслуживания. Это никак не связано с обновлением.

Обновления используются только при изменении ProductVersion и ProductCode.

Edit:

Чтобы предотвратить автоматический ремонт в режиме обслуживания, вы можете попробовать следующее:

Ответ 2

Во-первых, вы должны исправить код обновления:

<?define ProductVersion = "0.0.2.3"?>
<?define UpgradeCode = "PUT-GUID-HERE"?>

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

<Product Name="Asd" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Me" Id="*" UpgradeCode="$(var.UpgradeCode)">

Обратите внимание, что код продукта воссоздается каждый раз, когда вы строите установку (не используя GUID, а звездочку).

Основная информация - это версия продукта и код обновления. Код продукта идентифицирует конкретную развернутую версию, в то время как идентификатор кода обновления выпускает "семейство". Программные продукты, имеющие одинаковый код обновления, могут переключаться между собой. Программные продукты, имеющие одинаковые коды продуктов, не могут быть установлены на них.

Вот трюк, чтобы сделать обновление программного обеспечения:

<Upgrade Id="$(var.UpgradeCode)">
    <!-- Detect older product versions -->
    <UpgradeVersion OnlyDetect="no" IncludeMinimum="yes" IncludeMaximum="yes" Minimum="0.0.1" Maximum="$(var.ProductVersion)" Property="PREVIOUSVERSIONSINSTALLED"/>
    <!-- Detect newer product versions -->
    <UpgradeVersion OnlyDetect="yes" IncludeMinimum="no" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED"/>
</Upgrade>
    <!-- Exits successfully in the case newer version are already installed -->
<CustomActionRef Id="WixExitEarlyWithSuccess"/>

Используя вышеприведенную разметку, вы говорите, что установка Wix прерывается, когда он находит продукт с тем же UpgradeCode, но установленный имеет версию больше текущей, но начните установку (обновление текущего), если он найдет продукт, имеющий тот же UpgradeCode, и установленный, имеет версию меньше текущей.

IncludeMinimum и IncludeMaximum должны делать трюк, позволяя обновлению пропустить текущую версию.

Wix не устанавливает один и тот же продукт: вы должны быть уверены, что код продукта одинаковый для установленного программного обеспечения и программного обеспечения, упакованного в MSI: если они разные, они представляют собой разное развернутое программное обеспечение. Помимо этого, если продукт имеет тот же код продукта MSI, установка предлагает варианты восстановления/изменения: чтобы отключить их, вы должны играть с таблицей свойств пакета Wix, введя переменные ARP_ (вы можете отключить ремонт, изменить и удалить, но также установить контакты производителя и другие свойства).


Вот список переменных ARP. Я не знаю, каково их поведение при установке в бесшумном режиме, но если вы вызываете msiexec из командной строки, существует специальный способ ремонта для исправления (/f), поэтому как он может автоматически восстановить ваш продукт, если вы не запрашивать?