2017-05-15 2 views
2

Ich habe ein visuelles Studio-Projekt namens MyProject(P2P), die die ganze Zeit gut funktioniert.Escape-Klammern in Wix-Skript

Jetzt bin ich mit dem Wix 3 dieses Projekt in ein MSI zu packen, einer der Schritte ist es, den Knoten Component zu schreiben:

<Component Id="MyProject(P2P).exe" Guid="34565d5d-07d6-495d-a184-bb3bdebe1fb8"> 
    <File Source="$(var.MyProject(P2P).TargetPath)" KeyPath="yes" /> 
    </Component> 

Jetzt habe ich die Build-Fehler von Wix Projekt:

Product.wxs (807,0): Fehler CNDL0234: Schlecht ausgebildet Präprozessor Funktion '$ var.MyProject (P2P) .TargetPath'. Funktionen müssen ein Präfix (wie 'Spaß'), einen Namen mit mindestens 1 Zeichen und passende öffnende und schließende Klammern haben.

Sieht aus wie brauchen Flucht der ( und )? und wie?

Antwort

2

Ab WIX 3.11 gibt es keinen Mechanismus, um Klammern in Variablennamen zu umgehen. Der WIX-Pre-Prozessor sollte dies ohne die Notwendigkeit, Klammern zu entkommen, umgehen, aber in Ihrem Fall nicht wegen eines Fehlers und/oder Einschränkungen im Pre-Prozessor.

Um zu verstehen, was vor sich geht, müssen wir uns die entsprechende WIX-Quelldatei src\tools\wix\PreProcessor.cs ansehen, die unter https://github.com/wixtoolset/wix3/releases/tag/wix311rtm heruntergeladen werden kann. In dieser Datei nimmt die Funktion PreprocessString() eine Zeichenkette und versucht, die Vorprozessorvariablen in Form von $(...) durch die entsprechende Definition zu ersetzen (die Quelle dieser Funktion wurde nicht berücksichtigt, da sie ziemlich lang ist).

Weil Ihre Variable ein offenes Klammerzeichen enthält, ruft die PreprocessString() Funktion EvaluateFunction():

/// <summary> 
    /// Evaluate a function. 
    /// </summary> 
    /// <param name="sourceLineNumbers">The source line information for the function.</param> 
    /// <param name="function">The function expression including the prefix and name.</param> 
    /// <returns>The function value.</returns> 
    public string EvaluateFunction(SourceLineNumberCollection sourceLineNumbers, string function) 
    { 
     string[] prefixParts = function.Split(variableSplitter, 2); 
     // Check to make sure there are 2 parts and neither is an empty string. 
     if (2 != prefixParts.Length || 0 >= prefixParts[0].Length || 0 >= prefixParts[1].Length) 
     { 
      throw new WixException(WixErrors.InvalidPreprocessorFunction(sourceLineNumbers, function)); 
     } 
     string prefix = prefixParts[0]; 

     string[] functionParts = prefixParts[1].Split(new char[] { '(' }, 2); 
     // Check to make sure there are 2 parts, neither is an empty string, and the second part ends with a closing paren. 
     if (2 != functionParts.Length || 0 >= functionParts[0].Length || 0 >= functionParts[1].Length || !functionParts[1].EndsWith(")", StringComparison.Ordinal)) 
     { 
      throw new WixException(WixErrors.InvalidPreprocessorFunction(sourceLineNumbers, function)); 
     } 
     string functionName = functionParts[0]; 

     // Remove the trailing closing paren. 
     string allArgs = functionParts[1].Substring(0, functionParts[1].Length - 1); 

     // Parse the arguments and preprocess them. 
     string[] args = allArgs.Split(argumentSplitter); 
     for (int i = 0; i < args.Length; i++) 
     { 
      args[i] = this.PreprocessString(sourceLineNumbers, args[i].Trim()); 
     } 

     string result = this.EvaluateFunction(sourceLineNumbers, prefix, functionName, args); 

     // If the function didn't evaluate, try to evaluate the original value as a variable to support 
     // the use of open and closed parens inside variable names. Example: $(env.ProgramFiles(x86)) should resolve. 
     if (null == result) 
     { 
      result = this.GetVariableValue(sourceLineNumbers, function, false); 
     } 

     return result; 

Ihre Zeichenfolge bestehen aus drei Teilen durch die variableSplitter Zeichen getrennt, so dass der erste Test 2 != prefixParts.length ausfällt, was dazu führt ‚‘ in der Ausnahme geworfen.

Weiter versucht die Funktion, die Zeichenkette als Funktion auszuwerten, und wenn das fehlschlägt, greift sie auf die Auswertung der Zeichenkette als Variable zurück. Dies funktioniert für das im Kommentar genannte Beispiel: $(env.ProgramFiles(x86)).

vorschlagen einen Fehlerbericht auf dem Tracker bei https://github.com/wixtoolset/issues/issues Problem Bug WIX erhöhen.

Als Behelfslösung Sie einen relativen Pfad von dem Setup-Projekt für Ihre Anwendung Projekt verwenden könnten. Zum Beispiel:

<Component Id="MyProject(P2P).exe" Guid="34565d5d-07d6-495d-a184-bb3bdebe1fb8"> 
    <File Source="..\Release\MyProject(P2P).exe" KeyPath="yes" /> 
</Component