Wix / MSI - Как избежать установки одного и того же MSI дважды - PullRequest
13 голосов
/ 05 октября 2011

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

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

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

msiexec.exe / i Установщик.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-не-обнаружение-та же версия-предотвращение-downgrades-td5875840.html есть хорошоинформация, утверждая, что для этого сценария мыможет использовать свойство Installed , чтобы определить, установлен ли Product уже ...

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

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

Ответы [ 2 ]

13 голосов
/ 05 октября 2011

Прежде всего, вы должны исправить свой код обновления:

<?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, установка предлагает варианты восстановления / изменения: чтобы отключить их, вы должны поиграть с таблицей Property пакета Wix, введя *Переменные 1029 * ARP_ (можно отключить восстановление, изменение и удаление, а также настроить контакты производителя и другие свойства).


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

10 голосов
/ 05 октября 2011

Это не может быть сделано.

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

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

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

Edit:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...