Referenzieren einer WixVariable, die in einem WiX-Bibliotheksprojekt von einem WiX-Setup-Projekt definiert wurde
Ich versuche zu konfigurieren, dass ein WiX setup und die Bibliothek so, dass die version einer der Dateien in der Bibliothek verwendet wird, wie das Produkt/@Version in der setup.
Hintergrund
In einem setup mit den Dateien, die lokal definiert diese ist relativ unkompliziert, vorausgesetzt, die Komponente Projekt wird durch den WiX-Projekt und dann so konfiguriert:
<Component Id="Company.Assembly" Guid="[GUID]">
<File Id="Company.AssemblyFile"
Name="Company.Assembly.dll" KeyPath="yes"
DiskId="1"
Source="$(var.Company.Assembly.TargetPath)" />
</Component>
Dann die Produktversion kann so eingestellt werden,
<Product Id="[GUID]"
Name="Product Name"
Language="1033"
Version="!(bind.FileVersion.$(var.Company.AssemblyFile
.TargetFileName))"
Manufacturer="Company Name"
UpgradeCode="[GUID]">
Problem
Also nach dem Umzug alle Komponenten, um eine WiX-Bibliothek-Projekt ist es nicht mehr möglich, direkt auf den !(bind.FileVersion.$(var.Company.AssemblyFile.TargetFileName))
variable.
Ich habe versucht, die Konfiguration eines WixVariable in der Bibliothek
WixVariable Id="BuildVersion" Value="!(bind.FileVersion.Company.AssemblyFile)"/>
Und dann darauf verweisen, dass aus dem setup -
<Product Id="[GUID]"
Name="Product Name"
Language="1033"
Version="!(wix.BuildVersion)"
Manufacturer="Company Name"
UpgradeCode="[GUID]">
Ohne Erfolg.
Gibt es einige zusätzliche Schritt oder syntax erforderlich, entweder in der Bibliothek oder setup, um die WixVariable (oder eine Ableitung davon) zugänglich von dem setup?
InformationsquelleAutor der Frage Michael Phillips | 2011-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich diese hören eine Menge, und ich glaube nicht, dass die WiX-Dokumentation hat einen besonders guten job zu erklären, die situation, so ist es hier. Die kurze Antwort ist, dass Ihre syntax korrekt ist; eine variable deklariert mit der
WixVariable
element referenziert wird mit der syntax!(wix.VariableName)
und Sie können Variablen verwenden, die definiert wurden, die in einer referenzierten Bibliothek so!(wix.BuildVersion)
ist der richtige Wert für das Beispiel, das Sie gegeben haben, vor. Der Grund, warum es nicht funktionieren wird, weil der Wert muss überprüft werden, während der Kompilierung-phase, aber es ist nicht generiert, bis die Verknüpfung phase. So hier ist die lange Antwort:Gibt es zwei unterschiedliche Arten von Variablen, auf die Sie verweisen können, in eine *.wxs-Datei; Präprozessor Variablen und binder (oder linker) Variablen. Die ehemaligen verwiesen wird, mit den $ - syntax, z.B.
$(var.VariableName)
- und die letztere ist auf ! syntax, z.B.!(bind.FileVersion.FileId)
. Der wesentliche Unterschied ist einfach: Präprozessor-Variablen analysiert werden, die während der compile-phase (von candle.exe) und binder Variablen analysiert werden, während der link-phase (von light.exe). Der compiler ist dafür verantwortlich, die source -*.wxs-Dateien und kompilieren Sie Sie in *.wixobj-Dateien; es spielt keine Prozess die eigentliche Nutzlast, so ist es nicht in der Lage zu Lesen-version von Informationen aus einer verknüpften Datei. Die *.wixobj-Dateien werden dann an den linker übergeben, welche Prozesse der payload und erstellt die MSI-Datenbank. Der linker ist verantwortlich für die Erfassung von Metadaten aus der Nutzlast, das ist der Grund, warum es liefern können Werte für Variablen wie!(bind.FileVersion.FileId)
.Beachten Sie, dass eine variable deklariert mit der
WixVariable
element referenziert wird mit dem ! syntax es ist also ein binder variabel; es wird light.exe aber es wird nicht verfügbar sein candle.exe. Dies ist ein problem, weil candle.exe gilt die Validierung bestimmter Felder wie Produkt - /@Version. Es hat keine Ahnung, was!(wix.BuildVersion)
wird ausgewertet, so kann es nicht überprüfen, dass es die Ausbeute eines gültigen version. Im Gegensatz dazu, können Sie Weg mit!(bind.FileVersion.FileId)
weil Kerze ist zufrieden zur compile-Zeit, dass es aufgelöst wird, um eine gültige version zur link-Zeit (FileId ist ein direkter Verweis auf eine Datei in der Produkt Kerze so vertraut, dass es existieren wird, liefern eine Versionsnummer auf den link).So können Sie
!(wix.BuildVersion)
überall sonst in deiner *.wxs, aber Sie können nicht verwenden Sie es als Wert für das Produkt/@Version. Soweit ich weiß, nur binder variable, die Sie verwenden können, hier ist!(bind.FileVersion.FileId)
aber das ist natürlich nicht gut, wenn Sie wollen, um den Wert aus einer referenzierten Bibliothek. Ansonsten wirst du nur haben, um Ihre version Informationen von woanders, und übergeben es in die WiX-es ist also vorhanden, zur compile-Zeit. Wenn Sie MSBuild es kann abgefragt werden Informationen zur version mit derGetAssemblyIdentity
Aufgabe und kann diese übergeben zu WiX über die DefineConstants Eigenschaft. Die folgenden Ziele in deinem *.wixproj-Datei sollte es tun:Der BuildVersion-Eigenschaft übergeben werden candle.exe so können Sie die Referenz mit der Präprozessor-variable $(var.BuildVersion). Dies ist sicherlich nicht so sauber, wie es halten alle in der *.wxs-Datei, aber es ist ein Weg, um die version Informationen, die in die Kerze, so dass es kann verwendet werden wie eine variable in der Produkt - /@Version. Ich würde sicherlich gerne hören, keine besseren Möglichkeiten, dies zu tun.
InformationsquelleAutor der Antwort Anon
Ich hatte ein ähnliches Problem bei der Verwendung von Heat.exe dies erlaubte mir, überschreiben die Quell-variable, ohne Unordnung mit system-Umgebungsvariablen oder andere solche:
"%wix%bin\heat.exe" dir "$(SolutionDir)Web\obj\$(Configuration)\Package" -cg PACKAGEFILES -gg -g1 -sreg -srd -dr DEPLOYFOLDER -var wix.PackageSource="$(SolutionDir)Web\obj\$(Configuration)\Package" -out "$(SolutionDir)WebInstaller\PackageFragment.wxs"
Ich denke, diese syntax kann verwendet werden, für jede Variablen-Deklaration, die sonst nicht die Arbeit an der Verknüpfung Zeit:
Vielleicht hilfreich, in anderen Orten auch.
InformationsquelleAutor der Antwort Martin Clemens Bloch