2012-09-20 3 views
7

Ich möchte eine bestimmte EXE von meinem NAnt Skript aufrufen, und eine Eigenschaft als Argument übergeben, falls die Eigenschaft vorhanden, oder irgendetwas nicht anders passieren.Wie übergeben Sie das Argument an die NAnt-Exec-Task basierend auf der Eigenschaft existence?

Der Code unten scheint nur für diesen Fall zu passen, aber es funktioniert nicht:

<exec program="notepad.exe"> 
    <arg line="${file}" if="${property::exists('file')}" /> 
</exec> 

Es Property 'file' has not been set Fehler werfen. Sieht so aus, als werte es die Eigenschaft und ignoriert die Bedingung. Ich würde erwarten, dass es das gesamte <arg> Element ignoriert, falls sein Zustand false ist.

Wenn ich die Eigenschaft über diesen Block zu definieren, ist es offensichtlich gut funktioniert (auch wenn die Eigenschaft leer ist). Es könnte eine Umgehungslösung wert sein, wenn es sich um einen einzelnen Fall handelt, aber ich muss eine Reihe von Eigenschaften auf die gleiche Weise übergeben. Außerdem ist <if> kein gültiges Element unter <exec> ...

Wie erreicht man das? Irgendwelche Ideen?

Antwort

7

I dag aus an old thread at NAnt mailing list, die tatsächlich den besten Vorschlag für eine Abhilfe gibt (zu meinem Fall). Es basiert auf der Tatsache, dass <property> Task wie erwartet funktioniert. Die Problemumgehung führt eine zusätzliche Eigenschaft ein, die festgelegt wird, abhängig davon, ob die ursprüngliche Eigenschaft definiert ist oder nicht.

So:

<target name="example"> 
    <property name="arg.value" value="${arg}" if="${property::exists('arg')}" /> 
    <property name="arg.value" value="" unless="${property::exists('arg')}" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

In meinem Fall ist es stellt sich heraus, leichter zu sein, eine Eigenschaft mit Standardwert immer gesetzt und sogar eine zusätzliche Eigenschaft nicht vorstellen - nur die ursprüngliche Eigenschaft <arg/> passieren:

<target name="example"> 
    <property name="arg.value" value="default value" overwrite="false" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

Es kann (und wird) in anderen Include-Dateien überschrieben werden.

Ich habe auch gefunden another thread where the same question was asked, und eine Person in der NAnt Entwicklung beteiligt vorgeschlagen, um anzuzeigen, ob die Menschen an einem Patch interessiert sind, um dies für <arg> Element zu beheben. Soweit ich sehen kann, zeigte niemand das Interesse :), daher wurde das Verhalten nicht geändert.

ich es geschafft, ein wenig Zeit zu setzen untersuchen, was eine Korrektur sein könnte, und es scheint, dass es über das Hinzufügen von ExpandProperties=false zum TaskAttribute für beispielsweise nur ist die line Eigenschaft der <arg> Aufgabe. Das gleiche gilt für <property value="..."> Attribut, wo es wie erwartet funktioniert. Ich habe es aber nicht ausprobiert - wenn ich irgendwann noch etwas Zeit habe, werde ich hier ein Update posten.

+0

Sie können optional den Standard der gleichen Variablen festlegen, die Sie gerade lesen. Dies scheint klarer und ist stattdessen eine einzelne Aussage. BradLaney

+0

Meinst du basierend auf deinem Anwendungsfall Folgendes für dein zweites Code-Snippet?

0

Für diesen Fall können Sie nur eine fileset verwenden als Argumente zu übergeben. In der Standardeinstellung enthält Dateisatz keine Elemente, die nicht mit den tatsächlichen Dateien auf der Festplatte übereinstimmen.

+0

Vielen Dank für Ihren Vorschlag. Leider geht es nicht nur um Dateien - es war nur ein Beispiel. Ich muss eine Vielzahl von Argumenten unterschiedlicher Art durchgehen. Ich werde gestalten, was ich in einer Antwort gefunden habe. –

0

I (sogar mehr als einmal um ehrlich zu sein) auch in dieser Ausgabe lief. Das if -Attribut funktioniert in einigen Fällen nicht so, wie Sie es erwarten könnten. Das ist meine hässliche Abhilfe:

<choose> 
    <when test="${property::exists('file')}"> 
    <exec program="notepad.exe"> 
     <arg line="${file}" /> 
    </exec> 
    </when> 
    <otherwise> 
    <exec program="notepad.exe" /> 
    </otherwise> 
</choose> 
+0

Danke für Ihren Vorschlag. Nun, das macht Sinn für 1 Argument - aber ich muss eine große Anzahl von Argumenten übergeben. Ich werde gestalten, was ich in einer Antwort gefunden habe. –

Verwandte Themen