Erzwingen eines Upgrades von einer Datei, die während der Erstinstallation geändert wird

StackOverflow https://stackoverflow.com/questions/1432251

  •  07-07-2019
  •  | 
  •  

Frage

Ich arbeite auf der Upgrade-Funktion für mein WiX-basiertes Installationsprogramm.

Im Rahmen der Installation, werden wir eine web.config-Datei zu installieren und dann eine benutzerdefinierte Aktion unter Verwendung der Verbindungszeichenfolgen in der Datei zu aktualisieren.

Aber das führt zu einem Problem, wenn wir unser Upgrade laufen. Wir möchten die RemoveExistingProducts für nach InstallFinalize geplant haben, da diese am effizientesten in Bezug auf die nicht zu entfernen und neu zu installieren Dateien, die sich nicht verändert haben. Aber das bleibt die ursprüngliche Datei web.config im Ort zu der Zeit, wenn Windows Installer versucht, um festzustellen, ob es mich aktualisieren soll oder nicht. Da es aktuellere Datum der letzten Änderung als Datum seiner Erstellung ist, entscheidet Windows Installer nicht zu aktualisieren (siehe Versionsregeln dass Windows Installer verwendet). Aber wir müssen sie aktualisiert werden.

Eine offensichtliche Lösung ist die Zeitplanung von RemoveExistingProducts zu nach InstallValidate zu ändern - aber das ist ineffizient, und auch, ich glaube nicht, dass es uns die Möglichkeit geben würde, Einstellungen aus vorhandenen Dateien zu migrieren, sollten wir das tun müssen.

Jede andere Ideen?

War es hilfreich?

Lösung

Es gibt viele Möglichkeiten -. Keine sind ideal

1: Sie können eine Begleiter-Datei verwenden Aktualisierung der Datei in Frage zu erzwingen. Vorausgesetzt, die Begleitdatei aktualisiert immer wird angegeben, kann dies der Weg zu gehen. Im Wesentlichen bedeutet dies, dass Sie die nicht-versionierte Datei auf die Version Update-Logik seines Begleiter Datei verknüpfen (Dateien aktualisiert werden zusammen). Ich habe noch nie in WIX verwendet, aber ich denke, es ist so einfach, wie das Hinzufügen der CompanionFile Attribut in eine Datei Element und zeigen Sie auf die ID der Datei, die Sie wollen „Version folgen“. Im Inneren des MSI es in etwa so aussehen Datei:

eingeben Bild Beschreibung hier

2: Sie können eine benutzerdefinierte Aktion verwenden, um die Datei , bevor Datei Kalkulation (oder besser noch, benennen Sie sich in ein Backup-Format) zu löschen. Das Problem ist, dass, wenn das Setup der Datei fehlt wird ausfällt. Wenn Sie die Datei statt Löschen umbenennen können Sie es für den Fall, stellen nicht das Setup über eine Rollback-Aktion. Manchmal benutze ich die RemoveFile Tabellendateien zu entfernen, auf installieren, aber abhängig von der Sequenzierung in InstallExecuteSequence angegeben kann dies nicht funktionieren (Streichung muss geschehen, bevor msi tut Datei Kalkulation).

3: Dann gibt es die Holzhammermethode : set REIN = amus zu zwingen, alle Dateien zu überschreiben, unabhängig von Version. Ich soll nicht einmal erwähnt dies, da es schrecklich gefährlich ist (man kann das Überschreiben von Systemdateien beenden, oder auf neueren Windows-Versionen auslösen einen üblen Laufzeitfehler als Dateien geschützt sind). Verwenden Sie es nur für Entwickler Test und finde es nicht eine schnelle Lösung ist. Es verursacht mehr Probleme als sie löst.

Als Variante ein akzeptabler Ansatz kann die REIN zu Emus auf (ältere und gleiche Version Dateien ersetzen). Dies kann helfen, wenn Sie die Versionsnummern nicht erhöhen möchten, aber halten Sie Ihre Binärdateien Wiederaufbau - wie es der Fall in einer Menge von .NET ist. Meine Vermutung ist dies allerdings eine ganz neue Reihe von Problemen verursachen wird - am bedeutsamsten binären anders, aber Version identische Dateien in der freien Natur, wenn Sie es für öffentliche Veröffentlichungen verwenden - Einsatz Geruch , wenn es je war. Als QA / DEV Ansatz nur könnte es aber funktionieren. Aber im Ernst, warum die Mühe? Nur Auto-erhöht die Build-Version der Binärdateien und das Problem zuverlässig gelöst.


Links :

Andere Tipps

Nur iffy diejenigen. Sie könnten die bestimmte Datei früh mit einer benutzerdefinierten Aktion, entfernen Sie aber sicher sein, dieses Recht zu konditionieren! Sie können auch eine Version für die Datei angeben, damit Regeln aktualisieren wird es behandeln wie eine nicht-versionierte Datei mit einem versioniert zu ersetzen, aber dann kann Patches erhalten antsy über die falsche Version dieser Datei hat.

Sie eine benutzerdefinierte Aktion nicht verwenden, um Ihre Konfigurationsdatei zu aktualisieren, ist die andere offensichtliche Idee. Statt WIX erhalten das Update über die XML-Erweiterungen zu tun. Z.

<Component Id="web.config" Guid="f12ff575-ad5f-47bc-a5c9-40b1e3a7f9f5" >
    <File Source="$(var.SrcPath)\web.config.config" KeyPath="yes" />

    <util:XmlConfig Id="AppSqlInstanceName"
                    File="[#web.config]"
                    Action="create"
                    ElementPath="//configuration/connectionStrings/add[\[]@name='YourStringKey'[\]]"
                    Name="connectionString"
                    Node="value"
                    Value="metadata=res://*/YourModel.csdl|res://*/YourModel.ssdl|res://*/YourModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=[SQLSERVERANDINSTANCE];initial catalog=DatabaseName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
                    On="install"/>
</Component>

Dies ist ein [SQLSERVERANDINSTANCE] Variable, die Einrichtung vor der Hand sein muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top