2012-09-20 15 views
7

Chciałbym wywołać pewien plik EXE z mojego skryptu NAnt i przekazać właściwość jako argument, na wypadek gdyby właściwość istniała lub nie przekazać niczego innego.Jak przekazać argument do zadania NAnt exec warunkowo na podstawie istnienia nieruchomości?

Poniższy kod wydaje się pasować tylko w tym przypadku, ale to nie działa:

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

To rzucać Property 'file' has not been set błąd. Wygląda na to, że ocenia właściwość ignorując ten warunek. Spodziewam się, że zignoruje cały element <arg> w przypadku, gdy jego stan to false.

Jeśli zdefiniuję właściwość powyżej tego bloku, oczywiście działa poprawnie (nawet jeśli właściwość jest pusta). Może to być warte obejścia, jeśli jest to pojedynczy przypadek, ale muszę przekazywać wiele właściwości w ten sam sposób. Poza tym, <if> nie jest poprawnym elementem pod <exec> ...

Jak to osiągnąć? Jakieś pomysły?

Odpowiedz

7

i dag się an old thread at NAnt mailing list, który faktycznie daje najlepszą propozycję dla obejścia (moim przypadku). Jest to oparte na tym, że zadanie <property> działa zgodnie z oczekiwaniami. Obejście wprowadza dodatkową właściwość do ustawienia w zależności od tego, czy oryginalna właściwość jest zdefiniowana, czy nie.

Jak to:

<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> 

W moim przypadku okazało się, że zawsze łatwiej ustawić właściwość z domyślnej wartości, a nawet nie wprowadzają dodatkową właściwość - po prostu przekazać oryginalną właściwość <arg/>:

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

Może (i będzie) zostać nadpisany w innych plikach dołączanych.

Znalazłem również another thread where the same question was asked, a osoba zaangażowana w rozwój NAnt zasugerowała, aby wskazać, czy ludzie są zainteresowani łatą, aby naprawić ten element <arg>. O ile widzę, nikt nie wykazał zainteresowania :), stąd zachowanie nie uległo zmianie.

Udało mi się poświęcić trochę czasu na zbadanie, czym może być poprawka, i wydaje się, że chodzi tylko o dodanie ExpandProperties=false do TaskAttribute dla np. właściwość line zadania <arg>. To samo dotyczy atrybutu <property value="...">, w którym działa zgodnie z oczekiwaniami. Nie wypróbowałem go jednak - jeśli będę miał trochę więcej czasu w tych dniach, opublikuję i opublikuję tutaj aktualizację.

+0

Możesz opcjonalnie ustawić wartość domyślną dla tej samej zmiennej, którą czytasz. Wydaje się to bardziej przejrzyste i zamiast tego jest to pojedyncze zdanie. BradLaney

+0

Na podstawie Twojego przypadku użycia masz na myśli poniższy fragment drugiego fragmentu kodu?

0

W tym przypadku można po prostu użyć zestawu plików do przekazania jako argumenty. Domyślnie zestaw plików nie zawiera elementów, które nie pasują do rzeczywistych plików na dysku.

+0

Dzięki za sugestię. Niestety, nie chodzi tylko o pliki - to była tylko próbka. Muszę przekazać wiele argumentów o różnym charakterze. Będę kształtować to, co otrzymałem w odpowiedzi. –

0

Wystąpiłem również w tym numerze (szczerze mówiąc, nawet więcej niż raz). Atrybut if nie działa tak, jak byś tego oczekiwał. To jest mój brzydki obejście:

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

Dzięki za sugestię. To ma sens w przypadku 1 argumentu - ale muszę podać wiele argumentów. Będę kształtować to, co otrzymałem w odpowiedzi. –

Powiązane problemy