Как да предотвратите инсталирането на 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
вашият продукт id=* ли е?   -  person ColacX    schedule 01.10.2014
comment
Не, ние използваме уникален GUID за всяка отделна версия на продукта. Но проблемът не е в продукта, а в пакета. Както и да е, стигнахме до заключението, че това е стандартно поведение за Wix Bundle и че ще трябва да изградим наш собствен bootstrapper, за да изпълним нашите специфични изисквания.   -  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 причиняваше показване на допълнителни прозорци на bootstrapper след инсталиране на msi)

person Silny ToJa    schedule 08.06.2020