Wir verwenden WiX bereits seit einiger Zeit und trotz der üblichen Probleme mit der Benutzerfreundlichkeit läuft es recht gut. Was ich suche, ist ein nützlicher Rat in Bezug auf:
- Einrichten eines WiX-Projekts (Layout, Referenzen, Dateimuster)
- WiX in Lösungen integrieren und Prozesse erstellen / freigeben
- Konfigurieren von Installationsprogrammen für Neuinstallationen und Upgrades
- Alle guten WiX-Hacks, die Sie teilen möchten
practical, answerable questions based on actual problems that you face
Teil der FAQ.Antworten:
Bewahren Sie Variablen in einer separaten
wxi
Include-Datei auf. Ermöglicht die Wiederverwendung, Variablen sind schneller zu finden und ermöglichen (falls erforderlich) eine einfachere Bearbeitung durch ein externes Tool.Definieren Sie Plattformvariablen für x86- und x64-Builds
Speichern Sie den Installationsort in der Registrierung, damit Upgrades den richtigen Speicherort finden können. Zum Beispiel, wenn ein Benutzer ein benutzerdefiniertes Installationsverzeichnis festlegt.
Hinweis : Der WiX-Guru Rob Mensching hat einen hervorragenden Blogeintrag veröffentlicht, der detaillierter wird und einen Randfall behebt, wenn Eigenschaften über die Befehlszeile festgelegt werden.
Beispiele mit 1. 2. und 3.
und
Der einfachste Ansatz besteht immer darin, größere Upgrades durchzuführen , da sowohl Neuinstallationen als auch Upgrades in einem einzigen MSI möglich sind. UpgradeCode ist auf eine eindeutige Richtlinie festgelegt und wird sich nie ändern, es sei denn, wir möchten kein vorhandenes Produkt aktualisieren.
Hinweis : In WiX 3.5 gibt es ein neues MajorUpgrade- Element, das das Leben noch einfacher macht !
Erstellen eines Symbols in Software
Bei Release-Builds versionieren wir unsere Installationsprogramme und kopieren die MSI-Datei in ein Bereitstellungsverzeichnis. Ein Beispiel hierfür für die Verwendung eines wixproj-Ziels, das vom AfterBuild-Ziel aufgerufen wird:
Verwenden Sie Hitze, um Dateien mit Platzhalter (*) Guid zu ernten. Nützlich, wenn Sie WXS-Dateien für mehrere Projekte wiederverwenden möchten (siehe meine Antwort zu mehreren Versionen desselben Produkts). Diese Batchdatei sammelt beispielsweise automatisch die RoboHelp-Ausgabe.
Es ist ein bisschen los,
robocopy
wenn Subversion-Arbeitskopien-Metadaten vor dem Ernten entfernt werden. Die-dr
Stammverzeichnisreferenz wird auf unseren Installationsort und nicht auf das Standard-TARGETDIR festgelegt.-var
wird verwendet, um eine Variable zum Angeben des Quellverzeichnisses zu erstellen (Web Deployment-Ausgabe).Einfache Möglichkeit, die Produktversion in den Titel des Begrüßungsdialogs aufzunehmen, indem Sie Strings.wxl zur Lokalisierung verwenden. (Credit: saschabeaumont . Hinzugefügt, da dieser tolle Tipp in einem Kommentar versteckt ist)
Sparen Sie sich Schmerzen und befolgen Sie die Anweisungen von Wim Coehen zu einer Komponente pro Datei. Auf diese Weise können Sie auch
*
die Komponenten-GUID weglassen (oder mit einem Platzhalter versehen) .Rob Mensching hat eine gute Möglichkeit , Probleme in MSI-Protokolldateien durch Suchen schnell aufzuspüren
value 3
. Beachten Sie die Kommentare zur Internationalisierung.Wenn Sie bedingte Funktionen hinzufügen, ist es intuitiver, die Standardfunktionsebene auf 0 (deaktiviert) und dann die Bedingungsstufe auf den gewünschten Wert festzulegen. Wenn Sie die Standardfeature-Ebene> = 1 festlegen, muss die Bedingungsstufe 0 sein, um sie zu deaktivieren. Dies bedeutet, dass die Bedingungslogik das Gegenteil von dem sein muss, was Sie erwarten, was verwirrend sein kann :)
quelle
Überprüfen, ob IIS installiert ist:
Überprüfen, ob IIS 6 Metabase Compatibility unter Vista + installiert ist:
quelle
Bewahren Sie alle IDs in separaten Namespaces auf
F.
Beispielen: F.Documentation, F.Binaries, F.SampleCode.C.
: C.ChmFile, C.ReleaseNotes, C.LicenseFile, C.IniFile, C.RegistryCA.
: CA.LaunchHelp, CA.UpdateReadyDlg, CA.SetPropertyXFi.
Di.
Ich finde, dies hilft immens dabei, die verschiedenen IDs in den verschiedenen Kategorien im Auge zu behalten.
quelle
Fantastische Frage. Ich würde gerne einige Best Practices sehen.
Ich habe viele Dateien, die ich verteile, also habe ich mein Projekt in mehrere wxs-Quelldateien eingerichtet.
Ich habe eine Quelldatei der obersten Ebene, die ich Product.wxs nenne und die im Grunde die Struktur für die Installation enthält, aber nicht die eigentlichen Komponenten. Diese Datei besteht aus mehreren Abschnitten:
Die restlichen .wix-Dateien bestehen aus Fragmenten, die ComponentGroups enthalten, auf die im Feature-Tag in Product.wxs verwiesen wird. Mein Projekt enthält eine schöne logische Gruppierung der Dateien, die ich verteile
Dies ist nicht perfekt, mein OO-Spinnengefühl kribbelt ein wenig, weil die Fragmente auf Namen in der Datei Product.wxs verweisen müssen (z. B. DirectoryRef), aber ich finde es einfacher, diese einzelne große Quelldatei zu pflegen.
Ich würde gerne Kommentare dazu hören oder wenn jemand auch gute Tipps hat!
quelle
Fügen Sie dem Exit-Dialogfeld ein Kontrollkästchen hinzu, um die App oder die Hilfedatei zu starten.
...
Wenn Sie dies auf diese Weise tun, ist das "Standard" -Auftritt nicht ganz richtig. Das Kontrollkästchen ist immer grau hinterlegt, während der Dialog weiß ist:
Alternativtext http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/images/exit_dlg_1.gif
Eine Möglichkeit, dies zu umgehen, besteht darin , einen eigenen benutzerdefinierten ExitDialog mit einem Kontrollkästchen an einem anderen Ort anzugeben . Dies funktioniert, scheint aber eine Menge Arbeit zu sein, nur um die Farbe eines Steuerelements zu ändern. Eine andere Möglichkeit, das Gleiche zu lösen, besteht darin, die generierte MSI nachzubearbeiten, um die X- und Y-Felder in der Steuertabelle für das jeweilige CheckBox-Steuerelement zu ändern. Der Javascript-Code sieht folgendermaßen aus:
Wenn Sie diesen Code als Befehlszeilenskript (unter Verwendung von cscript.exe) ausführen, nachdem die MSI generiert wurde (aus light.exe), wird ein ExitDialog erstellt, der professioneller aussieht:
Alternativtext http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/images/exit_dlg_2.gif
quelle
WIXUI_EXITDIALOGOPTIONALCHECKBOX
mitWIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed
innen<Publish>
Erstellen von Live-, Test-, Schulungs-, ... Versionen mit denselben Quelldateien.
Kurz gesagt: Erstellen Sie einen eindeutigen UpgradeCode für jedes Installationsprogramm und definieren Sie automatisch das erste Zeichen jeder Guid für jedes Installationsprogramm, wobei die verbleibenden 31 eindeutig bleiben.
Voraussetzungen
Annahmen
Verzeichnisaufbau
Prozess
Beispiel Config.wxi
Beispiel Config.Common.wxi
Beispiel Components.wxs
Hinweis: Ich würde jetzt vorschlagen, das Guid-Attribut aus der Komponente herauszulassen (entspricht
*
), eine Datei pro Komponente zu verwenden und die Datei als Schlüsselpfad festzulegen. Dadurch entfallen die unten gezeigten AnrufeModifyComponentsGuids
undRevertComponentsGuids
Ziele. Dies ist jedoch möglicherweise nicht für alle Ihre Komponenten möglich.Beispiel Setup.Live.wixproj
Abschließende Gedanken
UPDATE 1: Automatisch generierte Komponenten-Guids machen das Aufrufen der FileUpdate-Task überflüssig, wenn Sie für jede Datei eine Komponente mit Guid = "*" erstellen und die Datei als Schlüsselpfad festlegen.
UPDATE 2: Eines der Probleme, auf das wir gestoßen sind, ist, dass die temporären Dateien manuell gelöscht werden müssen, wenn Sie die Komponenten-Guids nicht automatisch generieren und der Build fehlschlägt.UPDATE 3: Es wurde eine Möglichkeit gefunden, die Abhängigkeit von svn: externals und die temporäre Dateierstellung zu beseitigen. Dies macht den Erstellungsprozess widerstandsfähiger (und ist die beste Option, wenn Sie Ihre Guids nicht mit einem Platzhalter versehen können) und weniger spröde, wenn ein Erstellungsfehler bei Licht oder Kerze auftritt.
UPDATE 4: Die Unterstützung für mehrere Instanzen mithilfe von Instanztransformationen ist in WiX 3.0+ enthalten und auf jeden Fall auch einen Blick wert.
quelle
Verwenden der Msi-Diagnoseprotokollierung, um detaillierte Fehlerinformationen abzurufen
msiexec /i Package.msi /l*v c:\Package.log
Wo
ist der Name Ihres Pakets und Hier möchten Sie die Ausgabe des ProtokollsMsi-Fehlercodes
Wix-Intro-Video
Oh und zufälliges Wix-Intro-Video mit "Mr. WiX" Rob Mensching ist "konzeptionell ein großes Bild" hilfreich.
quelle
Verwenden Sie Javascript CustomActions, weil sie so einfach sind
Die Leute haben gesagt, dass Javascript das Falsche für MSI CustomActions ist . Gründe angegeben: schwer zu debuggen, schwer zuverlässig zu machen. Ich stimme nicht zu Es ist nicht schwer zu debuggen, schon gar nicht schwerer als C ++. Es ist einfach anders. Ich fand das Schreiben von CustomActions in Javascript sehr einfach, viel einfacher als die Verwendung von C ++. Viel schneller. Und genauso zuverlässig.
Es gibt nur einen Nachteil: Javascript CustomActions können über Orca extrahiert werden, während eine C / C ++ - Zertifizierungsstelle ein Reverse Engineering erfordern würde. Wenn Sie die Magie Ihres Installationsprogramms als geschütztes geistiges Eigentum betrachten, sollten Sie Skripte vermeiden.
Wenn Sie ein Skript verwenden, müssen Sie nur mit einer Struktur beginnen. Hier sind einige, um Ihnen den Einstieg zu erleichtern.
Javascript "Boilerplate" Code für CustomAction:
Registrieren Sie dann die benutzerdefinierte Aktion wie folgt:
Sie können natürlich beliebig viele Javascript-Funktionen für mehrere benutzerdefinierte Aktionen einfügen. Ein Beispiel: Ich habe Javascript verwendet, um eine WMI-Abfrage in IIS durchzuführen und eine Liste der vorhandenen Websites abzurufen, auf denen ein ISAPI-Filter installiert werden kann. Diese Liste wurde dann verwendet, um ein Listenfeld zu füllen, das später in der UI-Sequenz angezeigt wird. Alles sehr einfach.
Unter IIS7 gibt es keinen WMI-Anbieter für IIS, daher habe ich den
shell.Run()
Ansatz verwendet, um appcmd.exe aufzurufen, um die Arbeit auszuführen. Einfach.Verwandte Frage: Über Javascript CustomActions
quelle
Peter Tate hat bereits gezeigt, wie Sie wiederverwendbare ComponentGroup-Definitionen in separaten Wix-Fragmenten definieren können. Einige zusätzliche Tricks dazu:
Verzeichnis-Aliasing
Die Komponentengruppenfragmente müssen nichts über Verzeichnisse wissen, die von den Hauptprodukt-wxs definiert werden. In Ihrem Komponentengruppenfragment können Sie über einen Ordner wie diesen sprechen:
Dann kann das Hauptprodukt eines seiner Verzeichnisse (z. B. "productInstallFolder") wie folgt aliasisieren:
Abhängigkeitsdiagramm
ComponentGroup-Elemente können untergeordnete ComponentGroupRef-Elemente enthalten. Dies ist ideal, wenn Sie über einen großen Pool wiederverwendbarer Komponenten mit einem komplexen Abhängigkeitsdiagramm verfügen. Sie richten einfach eine ComponentGroup in einem eigenen Fragment für jede Komponente ein und deklarieren die Abhängigkeiten wie folgt:
Wenn Sie jetzt in Ihrem Setup auf die Komponentengruppe "B" verweisen, da es sich um eine direkte Abhängigkeit Ihrer Anwendung handelt, wird automatisch die Komponentengruppe "A" abgerufen, auch wenn der Anwendungsautor nie bemerkt hat, dass es sich um eine Abhängigkeit von "B" handelt. Es "funktioniert einfach", solange Sie keine zirkulären Abhängigkeiten haben.
Wiederverwendbare Wixlib
Die obige Idee eines Abhängigkeitsdiagramms funktioniert am besten, wenn Sie die Big-Pool-o-Reusable-Komponenten mit lit.exe zu einer wiederverwendbaren Wixlib kompilieren. Wenn Sie ein Anwendungssetup erstellen, können Sie auf diese wixlib ähnlich wie auf eine wixobj-Datei verweisen. Der Candle.exe-Linker entfernt automatisch alle Fragmente, die nicht von den Hauptprodukt-WXS-Dateien "eingezogen" werden.
quelle
Ich bin überrascht, dass niemand die Verwendung von T4 zum Generieren der WXS-Datei während des Builds erwähnt hat. Ich habe dies durch Henry Lee @ New Age Solutions erfahren .
Im Wesentlichen erstellen Sie eine benutzerdefinierte MSBuild-Aufgabe, um eine T4-Vorlage auszuführen, und diese Vorlage gibt das WXS unmittelbar vor dem Kompilieren des Wix-Projekts aus. Auf diese Weise können Sie (abhängig davon, wie Sie es implementieren) automatisch alle Assemblys einbeziehen, die beim Kompilieren einer anderen Lösung ausgegeben werden (was bedeutet, dass Sie die wxs nicht mehr bearbeiten müssen, wenn Sie eine neue Assembly hinzufügen).
quelle
Verwenden Sie Heat.exe, um das Gesicht zu zerschlagen und schmerzhaft großen Installationen "Epic Pwnage" zuzufügen
Erweiterung der Antworten von Si und Robert-P über Hitze.
Übersetzung: (Verwenden von Wärme, um zu vermeiden, dass einzelne Dateien von Hand in das Projekt eingegeben werden, und zum Automatisieren von Builds, um den Prozess insgesamt zu vereinfachen.)
WiX 2.0 Heat Syntax detailliert
Für neuere Versionen (nicht allzu verschieden von älteren Versionen, aber es gibt möglicherweise ärgerliche Syntaxänderungen ...) gehen Sie in das Verzeichnis Heat in der cmd.exe und geben Sie einfach heat ein, aber ich habe hier ein Beispiel, um Hilfe zu erhalten bei Bedarf mit neueren Versionen.
Hinzufügen von Folgendem zu Ihrem Build-Ereignis in Visual Studio 2010.
(Klicken Sie mit der rechten Maustaste auf Projekt-> Eigenschaften -> Build-Ereignisse-> Pre-Build-Ereignisse.)
$(WIX)bin\heat.exe" dir "$(EnviromentVariable)" -cg GroupVariable -gg -scom -sreg -sfrag - srd -dr INSTALLLOCATION -var env.LogicPath -out "$(FragmentDir)\FileName.wxs
Generiert Guids, wenn Wärme ausgeführt wird (wie bei der Ausführung des obigen Befehls).
Schnappen Sie sich nicht "COM-Dateien"
Schnappen Sie sich nicht "Registrierungsdateien"
Schnapp dir nicht "Fragmente"
Schnapp dir nicht das "root Dir"
dir gibt an, dass Heat in einem Ordner suchen soll
Der Name der Variablen, die Sie zu den Präprozessorvariablen im Abschnitt Projekteigenschaften (Rechtsklick auf Eigenschaften, Gehe zu Eigenschaften) hinzufügen würden-> Erstellen, in dem Präprozessorvariablen definieren steht (vorausgesetzt, Visual Studio 2010)
Keine doppelten Anführungszeichen, sondern mit einem Semikolon endenDie ComponentGroup, auf die aus dem erstellten Fragment in die Hauptdatei wxs verwiesen wird
Das Fragmentverzeichnis, in dem das Ausgabe-WXS-Fragment gespeichert wird
Der Name der Datei
Vollständiges Tutorial hier, also verdammt hilfreich
Teil 1 Teil 2
quelle
Einschließlich COM-Objekte:
heat
generiert die meisten (wenn nicht alle) Registrierungseinträge und andere für sie erforderliche Konfigurationen. Jubeln!Einschließlich verwalteter COM-Objekte (auch bekannt als .NET- oder C # COM-Objekte)
Wenn Sie
heat
ein verwaltetes COM-Objekt verwenden, erhalten Sie ein fast vollständiges Wix-Dokument.Wenn Sie die im GAC verfügbare Bibliothek nicht benötigen (dh global verfügbar: Meistens benötigen Sie dies bei Ihren .NET-Assemblys sowieso nicht - Sie haben an dieser Stelle wahrscheinlich etwas falsch gemacht, wenn dies nicht beabsichtigt ist eine gemeinsam genutzte Bibliothek) Sie sollten sicherstellen, dass der
CodeBase
Registrierungsschlüssel, auf den eingestellt werden soll, aktualisiert wird[#ComponentName]
. Wenn Sie vorhaben, es im GAC zu installieren (z. B. haben Sie eine neue großartige allgemeine Bibliothek erstellt, die jeder verwenden möchte), müssen Sie diesen Eintrag entfernen und demFile
Element zwei neue Attribute hinzufügen :Assembly
undKeyPath
. Die Assembly sollte auf ".net" undKeyPath
auf "yes" gesetzt sein.Einige Umgebungen (insbesondere alle mit verwaltetem Speicher, z. B. Skriptsprachen) benötigen jedoch auch Zugriff auf die Typelib. Stellen Sie sicher, dass Sie
heat
auf Ihrem Typelib laufen und es einschließen.heat
generiert alle erforderlichen Registrierungsschlüssel. Wie cool ist das?quelle
Installation zu
C:\ProductName
Einige Anwendungen müssen installiert werden
C:\ProductName
oder ähnliches, aber 99,9% (wenn nicht 100%) der Beispiele im Netz werden installiertC:\Program Files\CompanyName\ProductName
.Der folgende Code kann verwendet werden, um die
TARGETDIR
Eigenschaft auf das Stammverzeichnis desC:
Laufwerks festzulegen (aus der WiX-Benutzerliste entnommen ):HINWEIS: Zeigt standardmäßig
TARGETDIR
nicht aufC:\
! Es zeigt eherROOTDRIVE
auf die Wurzel des Laufwerks mit dem meisten freien Speicherplatz ( siehe hier ) - und dies ist nicht unbedingt dieC:
Laufwerk. Möglicherweise befindet sich eine andere Festplatte, Partition oder ein anderes USB-Laufwerk!Dann
<Product ...>
benötigen Sie irgendwo unter Ihrem Tag wie gewohnt die folgenden Verzeichnis-Tags:quelle
WindowsVolume
?WindowsVolume
Eigenschaft möglicherweise nicht alsDirectory
(Compiler gibt einen Fehler / eine Warnung aus) verwendet wird, wie hier und hier ausgeführt . Persönlich finde ich diese Problemumgehung verwirrend.Umgebungsvariablen
Beim Kompilieren Ihrer Wxs-Dokumente zu Wixobj-Code können Sie Umgebungsvariablen verwenden, um verschiedene Informationen zu ermitteln. Angenommen, Sie möchten ändern, welche Dateien in ein Projekt aufgenommen werden. Nehmen wir an, Sie haben eine Umgebungsvariable namens RELEASE_MODE, die Sie direkt vor dem Erstellen Ihrer MSI festgelegt haben (entweder mit einem Skript oder manuell, es spielt keine Rolle). In Ihrer Wix-Quelle können Sie Folgendes tun:
und verwenden Sie es später in Ihrem Code, um Ihr wxs-Dokument im laufenden Betrieb zu ändern, z.
quelle
Verwenden des RobM-Specials "Remember Property" Musters
http://robmensching.com/blog/posts/2010/5/2/The-WiX-toolsets-Remember-Property-pattern
quelle
Erstellen einer benutzerdefinierten Aktion für WIX, die in verwaltetem Code (C #) ohne Votive geschrieben wurde
http://www.codeproject.com/KB/install/wixcustomaction.aspx
quelle
Dialoge bearbeiten
Eine gute Möglichkeit zum Bearbeiten von Dialogen ist die Verwendung von SharpDevelop in einer Version 4.0.1.7090 (oder höher). Mit Hilfe dieses Tools kann ein eigenständiger Dialog (wxs-Dateien aus WiX-Quellen wie z. B. InstallDirDlg.wxs) in der Entwurfsansicht geöffnet, in der Vorschau angezeigt und bearbeitet werden.
quelle
Setzen des IIS enable 32BitAppOnWin64-Flags http://trycatchfail.com/blog/post/WiX-Snippet-change-enable32BitAppOnWin64.aspx
quelle
Ändern Sie "Bereit zur Installation?" Dialogfeld (auch bekannt als VerifyReadyDlg), um eine Zusammenfassung der getroffenen Entscheidungen bereitzustellen.
Es sieht so aus:
Alternativtext http://i46.tinypic.com/s4th7t.jpg
Tun Sie dies mit einer Javascript CustomAction:
Javascript-Code:
Deklarieren Sie die Javascript-Zertifizierungsstelle:
Befestigen Sie die Zertifizierungsstelle an einer Schaltfläche. In diesem Beispiel wird die Zertifizierungsstelle ausgelöst, wenn in CustomizeDlg auf Weiter geklickt wird:
Verwandte SO Frage: Wie kann ich zur Laufzeit den Text festlegen, der in VerifyReadyDlg angezeigt werden soll?
quelle
Fügen Sie Komponenten, die einzeln gepatcht werden können, in ihre eigenen Fragmente ein
Sowohl für Produktinstallationsprogramme als auch für Patches gilt: Wenn Sie eine Komponente in ein Fragment aufnehmen, müssen Sie alle Komponenten in dieses Fragment aufnehmen. Wenn Sie beim Erstellen eines Installationsprogramms Komponentenreferenzen verpassen, wird von light.exe ein Verknüpfungsfehler angezeigt. Wenn Sie jedoch einen Patch erstellen und eine einzelne Komponentenreferenz in ein Fragment aufnehmen, dann alle geänderten Komponenten dieses Fragments in Ihrem Patch angezeigt.
so was:
an Stelle von:
Wenn Sie mit dem Thema "Verwenden von reinem WiX" aus der Hilfedatei "WiX.chm" patchen, verwenden Sie dieses Verfahren, um den Patch zu generieren:
Es reicht nicht aus, nur die Version 1.1 von product.wixpdb zu erstellen, bei der die Komponenten in separaten Fragmenten verwendet werden. Stellen Sie daher sicher, dass Sie Ihr Produkt vor dem Versand korrekt fragmentieren.
quelle
Drucken von EULA ab Wix3.0 und höher
1) Wenn Sie Ihren Wix-Quellcode kompilieren, muss die Datei light.exe in der Befehlszeile auf die Datei WixUIExtension.dll verweisen. Verwenden Sie dazu den Befehlszeilenschalter -ext.
2) Wenn beim Hinzufügen des Verweises auf die Datei WixUIExtension.dll Ihr Projekt nicht kompiliert werden kann, liegt dies höchstwahrscheinlich an Konflikten zwischen Dialog-IDs, dh Ihr Projekt verwendete dieselben IDs von Dialogen wie einige Standarddialoge in WixUIExtension.dll. Geben Sie Ihren Dialogen unterschiedliche IDs. Dies ist ein recht häufiges Problem.
3) Ihr Lizenzdialog muss über ein ScrollableText-Steuerelement mit der ID "LicenseText" verfügen. Wix sucht beim Drucken nach genau diesem Kontrollnamen.
und einen PushButton, der auf die benutzerdefinierte Aktion verweist
4) Definieren Sie CustomAction mit der ID = "PrintEula" wie folgt:
Hinweis: BinaryKey unterscheidet sich in Wix3.0 von Wix2.0 und muss genau "WixUIWixca" sein (Groß- und Kleinschreibung beachten).
Wenn der Benutzer die Taste drückt, wird ihm das Standarddialogfeld "Drucker auswählen" angezeigt, und er kann von dort aus drucken.
quelle
Wir zeigen die Produktversion irgendwo (winzig) im ersten Bildschirm der GUI an. Weil die Leute jedes Mal Fehler machen, wenn sie die richtige Version auswählen. (Und halten Sie uns Entwickler auf der Suche nach Ewigkeiten ..)
Wir haben TFSBuild so eingerichtet, dass auch Transformationen (.mst-Dateien) mit der Konfiguration für unsere verschiedenen Umgebungen generiert werden. (Wir kennen alle Umgebungen, in denen wir bereitstellen müssen).
Da der ursprüngliche Weblog-Beitrag von Grant Holliday nicht verfügbar ist, habe ich seinen Inhalt hier kopiert:
MSBuild-Aufgabe zum Generieren von MSI-Transformationsdateien aus XMLMarch 11 2008
In meinem vorherigen Beitrag habe ich beschrieben, wie Sie MSI-Transformationsdateien (* .mst) verwenden können, um umgebungsspezifische Konfigurationseinstellungen von einem generischen MSI-Paket zu trennen.
Obwohl dies ein gewisses Maß an Flexibilität in Ihrer Konfiguration bietet, gibt es zwei Nachteile von Transformationsdateien:
Glücklicherweise können wir die Microsoft Windows Installer-Objektbibliothek (c: windowssystem32msi.dll) verwenden, um MSI-Datenbanken zu öffnen und Transformationsdateien zu erstellen.
Die Credits gehen wieder an Alex Shevchuk - Von MSI zu WiX - Teil 7 - Anpassen der Installation mithilfe von Transformationen, um zu zeigen, wie dies mit VbScript erreicht werden kann. Im Wesentlichen habe ich nur Alex 'Beispiel genommen und mit Interop.WindowsInstaller.dll eine MSBuild-Aufgabe implementiert. Die MSBuild-Aufgabe
Laden Sie hier den Quellcode und die Beispieltransformation transforms.xml herunter (~ 7Kb Zipped VS2008 Solution)
quelle
Vor dem Bereitstellen eines Installationspakets kontrolliere ich immer den Inhalt.
Es ist nur ein einfacher Aufruf an der Befehlszeile (laut Terrences-Post), die Befehlszeile zu öffnen und einzugeben
Dadurch wird der Paketinhalt in ein Unterverzeichnis 'Extract' mit dem aktuellen Pfad extrahiert.
quelle
Verwenden Sie anstelle von ORCA InstEd , ein gutes Tool zum Anzeigen von MSI-Tabellen. Es hat auch die Möglichkeit, zwei Pakete durch Transformieren -> Vergleichen mit ... zu unterscheiden.
Zusätzlich ist eine Plus-Version mit zusätzlichen Funktionen verfügbar. Aber auch die kostenlose Version bietet eine gute Alternative für Orca.
quelle
Registrieren von .NET-Assemblys für COM Interop mit x86 / x64-Kompatibilität
NB Dieses Fragment ist im Wesentlichen dasselbe wie REGASM Assembly.dll / codebase
In diesem Beispiel sind einige Dinge im Gange. Hier ist der Code und ich werde ihn anschließend erklären ...
Wenn Sie sich gefragt haben, ist dies tatsächlich für einen ASCOM-Teleskoptreiber .
Zuerst habe ich mich von oben beraten lassen und einige Plattformvariablen in einer separaten Datei erstellt. Sie können diese im XML verstreut sehen.
Der Wenn-Dann-Sonst-Teil oben befasst sich mit der Kompatibilität von x86 und x64. Meine Assembly zielt auf "Beliebige CPU" ab. Auf einem x64-System muss ich sie also zweimal registrieren, einmal in der 64-Bit-Registrierung und einmal in den 32-Bit-
Wow6432Node
Bereichen. Das Wenn-Dann-Sonst bereitet mich darauf vor, die Werte werdenforeach
später in einer Schleife verwendet. Auf diese Weise muss ich die Registrierungsschlüssel nur einmal erstellen (DRY-Prinzip).Das Dateielement gibt die tatsächliche Assembly-DLL an, die installiert und registriert wird:
Nichts Revolutionäres, aber beachten Sie das
Assembly=".net"
- dieses Attribut allein würde dazu führen, dass die Versammlung in den GAC aufgenommen wird, was NICHT das ist, was ich wollte. Die Verwendung desAssemblyApplication
Attributs, um auf sich selbst zurückzuweisen, ist einfach eine Möglichkeit, Wix daran zu hindern, die Datei in den GAC zu stellen. Jetzt, da Wix weiß, dass es sich um eine .net-Assembly handelt, kann ich bestimmte Binder-Variablen in meinem XML verwenden, z. B. die!(bind.assemblyFullname.filDriverAssembly)
, um den vollständigen Namen der Assembly abzurufen.quelle
Stellen Sie die
DISABLEADVTSHORTCUTS
Eigenschaft so ein, dass alle in Ihrem Installationsprogramm angekündigten Verknüpfungen zu regulären Verknüpfungen werden, und Sie müssen keinen Dummy-Registrierungsschlüssel angeben, der als Schlüsselpfad verwendet werden soll.Ich denke, Windows Installer 4.0 oder höher ist eine Voraussetzung .
quelle
Es ist eine schöne Struktur, aber aufgrund meiner Erfahrung frage ich mich, wie Sie diese Bedingungen angehen:
A. Ihre Installationen scheinen alle am selben Ziel zu landen. Wenn ein Benutzer alle 3 Versionen gleichzeitig installieren muss, lässt Ihr Prozess dies zu. Können sie eindeutig erkennen, welche Version jeder ausführbaren Datei sie auslösen?
B. Wie gehen Sie mit neuen Dateien um, die in TEST und / oder TRAINING vorhanden sind, aber noch nicht in LIVE?
quelle
Hier ist Weise können große Webprojekte überprüfen, ob die Anzahl der bereitgestellten Dateien mit der Anzahl der in eine MSI (oder ein Zusammenführungsmodul) integrierten Dateien übereinstimmt. Ich habe gerade die benutzerdefinierte MSBuild-Aufgabe für unsere Hauptanwendung ausgeführt (die sich noch in der Entwicklung befindet) und sie hat einige fehlende Dateien, hauptsächlich Bilder, gefunden, aber einige Javascript-Dateien waren durchgegangen!
Dieser Ansatz (Blick in die Dateitabelle von MSI durch Einbinden in das AfterBuild-Ziel des WiX-Projekts) kann für andere Anwendungstypen funktionieren, bei denen Sie Zugriff auf eine vollständige Liste der erwarteten Dateien haben.
quelle
Durchführen einer erzwungenen Neuinstallation, wenn eine Installation keine Deinstallation oder Neuinstallation zulässt und kein Rollback durchführt.
VBscript-Skript zum Überschreiben einer Installation, die aus irgendeinem Grund nicht deinstalliert wird.
quelle
Erstellen Sie eine Benutzeroberfläche mit einer benutzerdefinierten Aktion, mit der eine Variable festgelegt wird, und die Benutzeroberfläche deaktiviert / aktiviert die nächste Schaltfläche (oder eine ähnliche) basierend auf der in der benutzerdefinierten Aktion festgelegten Variablen.
Nicht so einfach wie man denkt, nicht zu schwierig, nur nirgendwo dokumentiert!
Wix-Interaktionen mit Bedingungen, Eigenschaften und benutzerdefinierten Aktionen
quelle