Vra

By die werk gebruik ons WiX vir die bou van installasie pakkette.Ons wil hê dat die installering van produk X sal lei tot die verwydering van die vorige weergawe van daardie produk op daardie masjien.

Ek het op verskeie plekke op die internet gelees van 'n groot opgradering, maar kon dit nie kry om te werk nie.Kan iemand asseblief die presiese stappe spesifiseer wat ek moet neem om die verwydering van vorige weergawe-funksie by WiX te voeg?

Was dit nuttig?

Oplossing

In die nuutste weergawes (vanaf die 3.5.1315.0 beta), kan jy die MajorUpgrade-element in plaas daarvan om jou eie te gebruik.

Byvoorbeeld, ons gebruik hierdie kode om outomatiese opgraderings te doen.Dit verhoed afgraderings, gee 'n gelokaliseerde foutboodskap, en verhoed ook die opgradering van 'n reeds bestaande identiese weergawe (d.w.s.slegs laer weergawes word opgegradeer):

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

Ander wenke

Ten slotte het ek 'n oplossing - ek dit hier plaas vir ander mense wat dieselfde probleem (al 5 van jou) kan hê:

  • Verander die produk ID vir *
  • Onder produk Voeg die volgende:

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="YOUR_GUID">  
       <UpgradeVersion
          Minimum="1.0.0.0" Maximum="99.0.0.0"
          Property="PREVIOUSVERSIONSINSTALLED"
          IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade> 
    
  • Onder InstallExecuteSequence voeg:

    <RemoveExistingProducts Before="InstallInitialize" /> 
    

Van nou af wanneer ek die produk installeer dit verwyder vorige geïnstalleer weergawes.

Nota: te vervang opgradering Id met jou eie GUID

Die volgende is die soort van sintaksis ek gebruik vir groot opgraderings:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
 <Upgrade Id="PUT-GUID-HERE">
    <UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
    <UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

As @Brian Gillespie opgemerk daar is ander plekke om die RemoveExistingProducts afhangende van die gewenste optimalisaties skeduleer. Let op die PUT-GUID-HIER moet identies wees.

Die opgradering element binne die produk element, gekombineer met 'n goeie skedulering van die aksie sal die verwydering van jy na voer. Maak seker dat jy 'n lys van die opgradering kodes van al die produkte wat jy wil verwyder.

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

Let daarop dat, indien jy versigtig wees met jou bou, jy kan verhoed dat mense per ongeluk 'n ouer weergawe van jou produk te installeer oor 'n nuwer een. Dit is wat die maksimum veld is vir. Wanneer ons bou installeerders, stel ons UpgradeVersion Maksimum om die weergawe wat gebou word, maar IncludeMaximum = "nee" om hierdie scenario te voorkom.

Jy het keuses met betrekking tot die skedulering van RemoveExistingProducts. Ek verkies dit skedulering na InstallFinalize (eerder as na InstallInitialize as ander aanbeveel):

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>

Dit laat die vorige weergawe van die produk geïnstalleer tot ná die nuwe lêers en register sleutels gekopieer. Dit laat my data migreer uit die ou weergawe van die nuwe (byvoorbeeld, het jy oorgeskakel stoor van gebruikers voorkeure van die register om 'n XML-lêer, maar jy wil beleefd te wees en hul instellings migreer). Hierdie migrasie gedoen word in 'n uitgestelde persoonlike aksie net voor InstallFinalize.

Nog 'n voordeel is doeltreffendheid: as daar onveranderd lêers, maak Windows Installer nie die moeite hulle weer kopiëring wanneer jy skeduleer nadat InstallFinalize. As jy skeduleer nadat InstallInitialize, is die vorige weergawe heeltemal eerste verwyder word, en dan die nuwe weergawe is geïnstalleer. Dit lei tot onnodige verwydering en recopying van lêers.

Vir ander skedulering opsies, sien die RemoveExistingProducts hulp onderwerp in MSDN. Hierdie week, die skakel is: http://msdn.microsoft.com/en- ons / library / aa371197.aspx

Jy kan dit dalk beter vra op die WiX-gebruikers poslys.

WiX word die beste gebruik met 'n goeie begrip van wat Windows Installer doen.Jy kan dalk oorweeg om "Die definitiewe gids vir Windows Installer".

Die aksie wat 'n bestaande produk verwyder, is die Verwyder bestaande produkte-aksie.Omdat die gevolge van wat dit doen, afhang van waar dit geskeduleer is - naamlik of 'n mislukking veroorsaak dat die ou produk weer geïnstalleer word, en of onveranderde lêers weer gekopieer word - moet jy dit self skeduleer.

RemoveExistingProducts prosesse <Upgrade> elemente in die huidige installasie, wat ooreenstem met die @Id toeskryf aan die UpgradeCode (gespesifiseer in die <Product> element) van al die geïnstalleerde produkte op die stelsel.Die UpgradeCode definieer 'n familie van verwante produkte.Enige produkte wat hierdie Opgraderingskode het, waarvan die weergawes in die gespesifiseerde reeks val, en waar die UpgradeVersion/@OnlyDetect eienskap is no (of weggelaat word), sal verwyder word.

Die dokumentasie vir RemoveExistingProducts noem die opstel van die UPGRADINGPRODUCTCODE eiendom.Dit beteken dat die verwyderingsproses vir die produk wat verwyder word ontvang daardie eiendom, waarvan die waarde die Product/@Id vir die produk wat geïnstalleer word.

As jou oorspronklike installasie nie 'n UpgradeCode, sal jy nie hierdie kenmerk kan gebruik nie.

Ek het hierdie webwerf gebruik om my te help om die basiese beginsels oor WiX Upgrade te verstaan:

http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

Daarna het ek 'n voorbeeldinstalleerder geskep ('n toetslêer geïnstalleer), en dan die Upgrade-installeerder geskep (2 voorbeeldtoetslêers geïnstalleer).Dit sal jou 'n basiese begrip gee van hoe die meganisme werk.

En soos Mike in die boek van Apress gesê het, "The Definitive Guide to Windows Installer", sal dit jou help om te verstaan, maar dit word nie met WiX geskryf nie.

Nog 'n webwerf wat baie nuttig was, was hierdie een:

http://www.wixwiki.com/index.php?title=Hoofblad

Ek lees die Wix dokumentasie, afgelaai voorbeelde, maar ek het nog baie probleme met opgraderings. Geringe opgraderings nie verwyder van die vorige produkte uit te voer ten spyte van die moontlikheid om dié te verwyder spesifiseer. Ek het meer as 'n dag vir ondersoeke en bevind dat Wix 3.5 intoduced n nuwe etiket vir die opgradering. Hier is die gebruik:

<MajorUpgrade Schedule="afterInstallInitialize"
        DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." 
        AllowDowngrades="no" />

Maar die hoofrede van probleme was dat dokumentasie sê om te gebruik die " REIN STALL = ALL REINSTALLMODE = vomus " parameters vir klein en klein opgraderings, maar dit nie doen sê dat diegene parameters is VERBODE vir groot opgraderings - hulle het eenvoudig ophou werk. So jy moet dit nie gebruik met groot opgraderings.

Ek stel voor dat 'n blik op handleiding Alex SHEVCHUK se. Hy verduidelik "groot opgradering" deur Wix met 'n goeie praktiese voorbeeld by Van MSI te Wix, Deel 8 -. groot opgradering

Een van die belangrike ding wat ek gemis het uit die tutoriale vir 'n rukkie (gesteel http://www.tramontana.co .hu / Wix / lesson4.php ) wat gelei het tot die "Nog 'n weergawe van hierdie produk is reeds geïnstalleer" foute:

* Klein updates beteken klein veranderinge aan een of 'n paar lêers waar die verandering waarborg nie die verandering van die produk weergawe (major.minor.build). Jy hoef nie na die produk GUID te verander deur òf. Let daarop dat jy altyd moet die pakket GUID verander wanneer jy 'n nuwe MSI-lêer wat verskil van die voriges in enige opsig te skep. Die Installer hou van jou geïnstalleerde programme en vind hulle aan wanneer die gebruiker wil verander of verwyder die installasie met behulp van hierdie GUID. Met behulp van dieselfde GUID vir verskillende pakkette sal die Installer verwar.

Klein opgraderings dui veranderinge waar die produk weergawe reeds verander. Verander die weergawe kenmerk van die produk etiket. Die produk sal dieselfde bly, sodat jy nie nodig het om die produk GUID verander, maar, natuurlik, kry 'n nuwe pakket GUID.

Groot opgraderings dui beduidende veranderinge soos om van een volledige weergawe na 'n ander. Verander alles:. Weergawe kenmerk, produk en pakket GUID

Ek gebruik die nuutste weergawe van Wix (3.0) en kan die bogenoemde werk nie. Maar dit het die werk:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
     Minimum="1.0.0.0"  IncludeMinimum="yes"
     Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>

Let daarop dat PUT-GUID-HIER moet dieselfde wees as die GUID wat jy in die eiendom UpgradeCode van die produk bepaal word.

Hier gewerk vir my.

<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0" 
    Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
    <UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0" 
        RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

Maak asseblief seker dat die UpgradeCode in Produk is wat ooreenstem met tot Id in gradeer.

Dit is wat vir my gewerk het, selfs met 'n groot AF graad:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top