Как предотвратить повторную установку пакета WiX с одним и тем же UpgradeCode/Version

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

Когда я запускаю MSI отдельно, он работает так, как ожидалось: программу установки нельзя запустить дважды. То же самое относится и к повторному запуску того же самого пакета. Но просто пересобрав пакет (используя те же UpgradeCode и Version), вместо этого установка продолжается (на этот раз намного быстрее), и я получаю дублирующую запись среди установленных программ. Я действительно хотел бы предотвратить это и заставить пакет работать как MSI.

Я пробовал с различными условиями, установленными в комплекте; NOT WixBundleInstalled, WixBundleInstalled != 1 и т. д. Но ничего из этого не работает.

Для справки, вот оператор пакета:

<Bundle UpgradeCode="{FAF9CBDD-BE89-4B18-9921-FD5B426B5B0C}" IconSourceFile="$(var.SolutionDir)Resources\product.ico" 
          Name="Product 4.4" Version="4.4.0.0" Manufacturer="My Company" DisableModify="yes" Condition="NOT (WixBundleInstalled = 1)">

person Torbjörn Bergstedt    schedule 21.05.2014    source источник
comment
Я знаю случай, когда это может произойти при установке msi (не пакета): если 2 msi имеют одинаковый код обновления, но установлены в разных контекстах (один устанавливает для пользователя, а другой - для машины), то будет не будет апгрейда, т.е. у вас будет 2 повторяющиеся записи.   -  person Brainless    schedule 22.05.2014
comment
Спасибо. Кроме нашего собственного MSI, есть один внешний (предварительно созданный) MSI, который мы включаем в комплект. Я попытался добавить ForcePerMachine="yes" к этому оператору MSIPackage, но это не помогло.   -  person Torbjörn Bergstedt    schedule 22.05.2014
comment
ваш идентификатор продукта = *?   -  person ColacX    schedule 01.10.2014
comment
Нет, мы используем уникальный GUID для каждой отдельной версии продукта. Но проблема не в товаре, а в комплектации. В любом случае, мы пришли к выводу, что это стандартное поведение для Wix Bundle, и что нам нужно будет создать собственный загрузчик для выполнения наших конкретных требований.   -  person Torbjörn Bergstedt    schedule 02.10.2014
comment
Несколько записей в разделе Установка и удаление программ вызваны тем, что модуль записи не поддерживает обновления той же версии. См. wixtoolset.org/issues/3746 для получения дополнительной информации.   -  person bradfordrg    schedule 19.06.2015


Ответы (2)


Если вы добавите тег OptionalUpdateRegistration, вы получите запись в реестре, которую можно использовать как InstallCondition для вашего пакета MSI.

<OptionalUpdateRegistration ProductFamily="MyProductFamily" Name="MyAppBundle"/>

<util:RegistrySearch Id="SearchForMyProduct" 
                     Root="HKLM" 
                     Key="SOFTWARE\WOW6432NODE\MyCompany\Updates\MyProductFamily\MyAppBundle" 
                     Value="PackageVersion" 
                     Result="exists" />

<MsiPackage Id="MyMsi"
            InstallCondition=SearchForMyProduct
            DisplayName="My Wonderful Product"
            SourceFile="MyProduct.msi"
            ForcePerMachine="yes"/>

Это предотвратит повторную установку "MyProduct" новой версией пакета. Это не помешает установке пакета после того, как вы уже установили его из MSI. Для этого у вас также может быть тег RegistrySearch для ключа, созданного вашим MSI.

person philselmer    schedule 22.08.2017
comment
Это несколько улучшило установку пакета, но, к сожалению, простое выполнение пакета снова регистрирует другой (идентичный) пакет. - person Torbjörn Bergstedt; 14.09.2017

Добавьте DisableRemove="yes" и DisableModify="yes" в Bundle и Visible="yes" в MSI. Он может показывать только экземпляр MSI в программах удаления/добавления.

<Bundle Name="InstallerBoot" Version="$(var.BuildVersion)" Manufacturer="Company" UpgradeCode="GUID" DisableRemove="yes" DisableModify="yes">
    ...
    <MsiPackage Id="MainPackage" SourceFile="..\Installer.msi" DisplayInternalUI="yes" Compressed="yes" Vital="no" Visible="yes">
</Bundle>

И измените UpgradeCode в Bundle для каждой версии. (В моей программе не меняйте upgradeCode, чтобы после установки msi отображались дополнительные окна загрузчика)

person Silny ToJa    schedule 08.06.2020