Was ist das wix-Attribut 'KeyPath'?

123

Was ist das Wix -Attribut ' KeyPath '? Wie gilt dies insbesondere für Folgendes:

<Component Id="ProgramMenuDir" Guid="*">
  <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
  <RegistryValue Root="HKCU" Key="Software\CompName\AppName" 
                 Type="string" Value="" KeyPath="yes" />
</Component>
Seth
quelle
111
OMG die Wix-Dokumentation ist völlig nutzlos. Das wix-Dokument besagt für das KeyPath-Attribut, dass die Datei als Schlüsselpfad für die Komponente behandelt wird, wenn Sie sie auf "Ja" setzen. Soooo hilfreich !!
Cheeso
5
@RobMensching - schätzen Sie Ihren Geist und Ihre Bereitschaft, zur Gemeinschaft beizutragen. Mir zu sagen, wie ich mich NICHT beschweren soll, ist nicht so gut wie mir (und anderen) zu sagen, wie ich mich beschweren soll. Wenn ich vor 2 Jahren gewusst hätte, wo ich einen Fehler auslösen könnte, hätte ich es getan. Wie Sie an den positiven Stimmen sehen können, fühlen sich anscheinend auch andere Menschen ähnlich. Vielleicht ist es Zeit für diese Art von Nachricht: "Helfen Sie, WiX zu verbessern! Bitte melden Sie entsprechende Fehler, indem Sie HIER klicken ".
Cheeso
21
Wird reichen, @Cheeso! Bitte melden
Rob Mensching
8
@Cheeso Das wichtigste zu verstehende Konzept ist, dass ein WiX-Setup-Projekt ein Windows Installer-Paket erstellt. Die WiX-Dokumente duplizieren (und sollten meistens nicht) die Windows Installer-Dokumente nicht. Obwohl Sie häufig ein WiX-Konstrukt verwenden können, ohne die unterstützten Windows Installer-Tabellen zu verstehen, sollten Sie bei Fragen die Dokumente auf MSDN überprüfen. Beginnen Sie hier für Komponenten .
Tom Blodget
30
@ TomBlodget: Ich würde argumentieren, dass WiX Windows Installer-Dokumente duplizieren sollte. Für die meisten Benutzer führt die Aufteilung des WiX / Windows-Installationsprogramms lediglich zu Verwirrung. Je mehr Informationen für den Endbenutzer verborgen werden können, desto einfacher ist die Verwendung des gesamten Tools.
Scott Stafford

Antworten:

122

Wie von Rob Mensching erklärt :

Der Schlüsselpfad für eine Komponente ist eine einzelne Ressource, mit der das Windows-Installationsprogramm ermittelt, ob eine Komponente auf einem Computer "vorhanden" ist.

Wenn Windows Installer entscheidet, ob Ihre Komponente installiert werden soll, wird zunächst geprüft, ob die Schlüsselpfadressource bereits vorhanden ist. Wenn dies der Fall ist, wird keine der Ressourcen in der Komponente installiert.

Das Vorhandensein der Schlüsselpfadressource bestimmt auch, ob eine Komponente beschädigt wurde oder verloren gegangen ist, wenn Sie eine MSI "reparieren".

Wenn es sich bei der Schlüsselpfadressource um eine versionierte Datei handelt, betrachtet Windows Installer sie nur dann als vorhanden, wenn eine Datei mit einer gleichen oder einer höheren Version gefunden wird.

In Ihrem speziellen Beispiel haben Sie eine Komponente, die bei der Deinstallation einen Ordner entfernt. Diese Komponente wird nur installiert, wenn der angegebene Registrierungsschlüssel noch nicht vorhanden ist. Das Hinzufügen eines Registrierungsschlüssels zur Verwendung als Schlüsselpfad ist ein häufiger Trick, wenn Sie einen Schlüsselpfad für eine Komponente benötigen, die Ressourcen installiert, die selbst nicht als Schlüsselpfad verwendet werden können, z. B. eine Verknüpfung .

Wim Coenen
quelle
4
Was bringt es also, der einzigen Datei in einer Komponente explizit das Attribut keypath = "no" zuzuweisen?
Christopher B. Adkins
4
@Adkins: Das würde das Standardverhalten von wix unterdrücken, um diese Datei als Schlüsselpfad zu verwenden. Infolgedessen wird für diese Komponente kein Schlüsselpfad in die Installationsdatenbank geschrieben. Während der Installation wird Windows Installer verwenden Sie dann den Zielordner der Komponente als Schlüsselpfad. Eine andere Möglichkeit, dieses Verhalten zu erhalten, besteht darin, "Schlüsselpfad = Ja" für das Komponentenelement selbst festzulegen. Auf jeden Fall scheint es mir keine gute Idee zu sein.
Wim Coenen