it-swarm.com.de

Wie implementiere ich ein WiX-Installationsupgrade?

Bei der Arbeit verwenden wir WiX zum Erstellen von Installationspaketen. Wir möchten, dass die Installation von Produkt X zur Deinstallation der vorherigen Version dieses Produkts auf diesem Computer führt.

Ich habe an mehreren Stellen im Internet über ein größeres Upgrade gelesen, konnte es aber nicht zum Laufen bringen. Kann jemand bitte die genauen Schritte angeben, die ich ausführen muss, um die Funktion zur Deinstallation früherer Versionen zu WiX hinzuzufügen?

228
Dror Helper

In den neuesten Versionen (ab der Betaversion 3.5.1315.0) können Sie das MajorUpgrade-Element anstelle Ihres eigenen verwenden.

Mit diesem Code führen wir beispielsweise automatische Upgrades durch. Es verhindert Downgrades und gibt eine lokalisierte Fehlermeldung aus. Außerdem wird verhindert, dass eine bereits vorhandene identische Version aktualisiert wird (d. H., Dass nur niedrigere Versionen aktualisiert werden):

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

Endlich habe ich eine Lösung gefunden - ich poste sie hier für andere Leute, die das gleiche Problem haben könnten (ihr alle 5):

  • Ändern Sie die Produkt-ID in *
  • Unter Produkt fügen Sie Folgendes hinzu:

    <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> 
    
  • Fügen Sie unter InstallExecuteSequence Folgendes hinzu:

    <RemoveExistingProducts Before="InstallInitialize" /> 
    

Von nun an entfernte ich frühere installierte Versionen, wenn ich das Produkt installiere.

Hinweis: Ersetzen Sie die Upgrade-ID durch Ihre eigene GUID

219
Dror Helper

Das Folgende ist die Art von Syntax, die ich für größere Upgrades verwende:

<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>

Wie @Brian Gillespie feststellte, gibt es andere Orte, an denen die RemoveExistingProducts in Abhängigkeit von den gewünschten Optimierungen geplant werden können. Beachten Sie, dass die PUT-GUID-HERE identisch sein muss.

88
Rob Mensching

Das Upgrade-Element im Product-Element führt in Kombination mit der richtigen Planung der Aktion die von Ihnen gewünschte Deinstallation durch. Stellen Sie sicher, dass Sie die Upgrade-Codes aller Produkte auflisten, die Sie entfernen möchten.

<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>

Beachten Sie, dass Sie, wenn Sie mit Ihren Builds vorsichtig sind, verhindern können, dass versehentlich eine ältere Version Ihres Produkts über eine neuere installiert wird. Dafür gibt es das Maximum-Feld. Wenn wir Installationsprogramme erstellen, setzen wir UpgradeVersion Maximum auf die zu erstellende Version, IncludeMaximum = "no", um dieses Szenario zu verhindern.

Sie haben die Wahl bezüglich der Planung von RemoveExistingProducts. Ich bevorzuge es nach InstallFinalize zu planen (anstatt nach InstallInitialize, wie andere empfohlen haben):

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

Dadurch bleibt die vorherige Version des Produkts installiert, bis die neuen Dateien und Registrierungsschlüssel kopiert wurden. Auf diese Weise kann ich Daten von der alten auf die neue Version migrieren (Sie haben beispielsweise die Speicherung von Benutzereinstellungen aus der Registrierung auf eine XML-Datei umgestellt, möchten aber höflich sein und deren Einstellungen migrieren). Diese Migration wird in einer verzögerten benutzerdefinierten Aktion unmittelbar vor InstallFinalize durchgeführt.

Ein weiterer Vorteil ist die Effizienz: Wenn unveränderte Dateien vorhanden sind, stört Windows Installer das erneute Kopieren nicht, wenn Sie nach InstallFinalize einen Zeitplan erstellen. Wenn Sie nach InstallInitialize planen, wird zuerst die vorherige Version vollständig entfernt und dann die neue Version installiert. Dies führt zu unnötigem Löschen und erneutem Kopieren von Dateien.

Weitere Planungsoptionen finden Sie im Hilfethema RemoveExistingProducts in MSDN. Diese Woche lautet der Link: http://msdn.Microsoft.com/en-us/library/aa371197.aspx

40
Brian Gillespie

Fragen Sie dies besser in der WiX-Benutzer-Mailingliste .

WiX wird am besten verwendet, wenn Sie genau wissen, was Windows Installer tut. Sie könnten erwägen, " The Definitive Guide to Windows Installer " zu erhalten.

Die Aktion, die ein vorhandenes Produkt entfernt, ist die Aktion RemoveExistingProducts . Da die Konsequenzen der Aktion davon abhängen, wo sie geplant ist - nämlich ob ein Fehler die Neuinstallation des alten Produkts verursacht und ob unveränderte Dateien erneut kopiert werden - müssen Sie diese selbst planen.

RemoveExistingProducts verarbeitet <Upgrade> - Elemente in der aktuellen Installation und ordnet das Attribut @Id dem UpgradeCode (angegeben im Element <Product>) aller zu die auf dem System installierten Produkte. Das UpgradeCode definiert eine Familie verwandter Produkte. Alle Produkte mit diesem UpgradeCode, deren Versionen in den angegebenen Bereich fallen und bei denen das Attribut UpgradeVersion/@OnlyDetectno ist (oder weggelassen wird), werden entfernt.

In der Dokumentation zu RemoveExistingProducts wird das Festlegen der Eigenschaft UPGRADINGPRODUCTCODE erwähnt. Dies bedeutet, dass der Deinstallationsprozess für das zu entfernende Produkt diese Eigenschaft erhält, deren Wert Product/@Id Für das zu installierende Produkt ist.

Wenn Ihre ursprüngliche Installation kein UpgradeCode enthielt, können Sie diese Funktion nicht verwenden.

15
Mike Dimmick

Ich habe diese Website verwendet, um die Grundlagen des WiX-Upgrades zu verstehen:

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

Danach habe ich ein Beispiel-Installationsprogramm erstellt (eine Testdatei installiert) und dann das Upgrade-Installationsprogramm erstellt (2 Beispiel-Testdateien installiert). Dadurch erhalten Sie ein grundlegendes Verständnis der Funktionsweise des Mechanismus.

Und wie Mike in dem Buch von Apress "The Definitive Guide to Windows Installer" sagte, wird es Ihnen helfen, es zu verstehen, aber es ist nicht mit WiX geschrieben.

Eine andere Seite, die sehr hilfreich war, war diese:

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

11
CheGueVerra

Ich habe die WiX -Dokumentation gelesen und Beispiele heruntergeladen, aber ich hatte immer noch viele Probleme mit Upgrades. Bei kleineren Upgrades wird die Deinstallation der vorherigen Produkte nicht ausgeführt, obwohl die Möglichkeit besteht, diese zu deinstallieren. Ich habe mehr als einen Tag für Untersuchungen aufgewendet und festgestellt, dass WiX 3.5 ein neues Tag für Upgrades eingeführt hat. Hier ist die Verwendung:

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

Der Hauptgrund für Probleme war jedoch, dass die Dokumentation die Verwendung des " REINSTALL = ALL REINSTALLMODE = vomus "Parameter für kleinere und kleinere Upgrades, aber es heißt nicht, dass diese Parameter für größere Upgrades VERBOTEN sind - sie hören einfach auf Arbeiten. Sie sollten sie also nicht mit größeren Upgrades verwenden.

10
Sasha

Ich würde vorschlagen, sich das Tutorial von Alex Shevchuk anzuschauen. Er erklärt "Major Upgrade" über WiX anhand eines praktischen Beispiels unter Von MSI zu WiX, Teil 8 - Major Upgrade .

7
Faraz

Eine wichtige Sache, die ich in den Tutorials für eine Weile verpasst habe (gestohlen von http://www.tramontana.co.hu/wix/lesson4.php ), die zur "Eine andere Version dieses Produkts ist Bereits installierte "Fehler:

* Kleine Updates bedeuten kleine Änderungen an einer oder mehreren Dateien, bei denen die Änderung keine Änderung der Produktversion rechtfertigt (major.minor). bauen). Sie müssen auch die Produkt-GUID nicht ändern. Beachten Sie, dass Sie das Paket GUID immer ändern müssen, wenn Sie eine neue .msi-Datei erstellen, die sich in irgendeiner Hinsicht von der vorherigen unterscheidet. Das Installationsprogramm verfolgt Ihre installierten Programme und findet sie, wenn der Benutzer die Installation mithilfe dieser GUIDs ändern oder entfernen möchte. Die Verwendung desselben GUID für verschiedene Pakete verwirrt den Installer.

Kleinere Upgrades kennzeichnet Änderungen, bei denen sich die Produktversion bereits ändert. Ändern Sie das Versionsattribut des Produkttags. Das Produkt bleibt unverändert, so dass Sie das Produkt GUID nicht ändern müssen, aber natürlich eine neue Paket-GUID erhalten.

Wichtige Upgrades kennzeichnen wichtige Änderungen wie das Wechseln von einer Vollversion zur nächsten. Ändere alles: Versionsattribut, Produkt- und Paket-GUIDs.

7
Daniel Morritt

Ich verwende die neueste Version von WiX (3.0) und konnte die oben genannten Probleme nicht lösen. Aber das hat funktioniert:

<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>

Beachten Sie, dass die PUT-GUID-HERE mit der GUID identisch sein sollte, die Sie in der UpgradeCode-Eigenschaft des Produkts definiert haben.

5
Merill Fernando

Unten hat bei mir gearbeitet.

<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>

Stellen Sie sicher, dass der UpgradeCode im Produkt mit der ID im Upgrade übereinstimmt.

2
NishantJ

Das hat bei mir auch mit Major geklappt DOWN grade:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
1