2013-11-20 8 views
6

In Ant 1.9.1 können Sie if and unless attributes für die meisten Aufgaben verwenden.Ant wenn: wahr. Wenn die Eigenschaft auf "true" gesetzt wird, wird die Aufgabe nicht ausgeführt.

Ich habe ein Makro I definiert haben, wo ich versuche, diese Aufgaben auszuführen:

<property name="test.templates"  value="true"/> 
.... 
<target name="test.templates" 
    description="Test the autoconfiguration templates and answers"> 
    <test.templates 
     if:true="test.templates" 
     template.root.dir="${main.dir}" 
     answers.dir="${main.config.dir}"/> 
</target> 

Dies wird jedoch nicht ausgeführt mein Macro - obwohl die Eigenschaft test.templates auf true gesetzt ist. Wenn ich diese Zeile entferne, funktioniert mein test.template-Makro.

Gibt es ein Problem mit if:true in einem benutzerdefinierten Makro? Was ist der beste Weg, um dieses Problem zu umgehen?

+0

ich bemerkt, dass Sie haben ein Ziel, das Eigentum und Makro alle genannten „test.templates“ –

+0

einen Fehlerbericht Gefüllt nach wie vor Problem bleibt mit neuer Ameise vom 29. Dezember 2013 - siehe meine aktualisierte Antwort EDIT (2) für Details. – Rebse

+0

Lösung gefunden - siehe meine aktualisierte Antwort EDIT (3)! – Rebse

Antwort

7

Von ant manual:

Da Ant 1.9.1 ist es möglich, wenn und wenn Attribute auf allen Aufgaben und verschachtelte Elemente mit speziellen Namensraum hinzuzufügen.

Haben Sie nicht den neuen verwenden, wenn und es sei denn, Attribute in einem macrodef bis jetzt, aber die folgenden Ausschnitt funktioniert:

<project xmlns:if="ant:if" xmlns:unless="ant:unless"> 

    <property name="foo" value="true"/> 

    <macrodef name="foobar"> 
    <attribute name="bla"/> 
    <attribute name="whentrue"/> 
    <sequential> 
     <echo if:true="${@{whentrue}}">@{bla}</echo> 
    </sequential> 
    </macrodef> 

    <echo>${ant.version}</echo> 
    <foobar whentrue="foo" bla="yada,yada"/> 

    </project> 

Hinweis => die Eigenschaft Syntax <echo if:true="${@{whentrue}}">, es funktioniert nicht bei Verwendung von Nur @ {wowtrue}.

Ausgang:

[echo] Apache Ant(TM) version 1.9.1 compiled on May 15 2013 
[echo] yada,yada 

Mein anderer Versuch:

<macrodef name="foobar" if:true="foo"> 
<attribute name="bla"/> 
<sequential> 
    <echo>@{bla}</echo> 
</sequential> 
</macrodef> 

<echo>${ant.version}</echo> 
<foobar bla="yada,yada"/> 

hat nicht funktioniert:

... Problem: failed to create task or type foobar 
Cause: The name is undefined. 
Action: Check the spelling. 
Action: Check that any custom tasks/types have been declared. 
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 

auch angenommen, dass so etwas wie <foobar bla="yada,yada" if:true="foo"/> funktionieren würde:

<project xmlns:if="ant:if" xmlns:unless="ant:unless"> 

    <property name="foo" value="true"/> 

    <macrodef name="foobar"> 
    <attribute name="bla"/> 
    <sequential> 
    <echo>@{bla}</echo> 
    </sequential> 
    </macrodef> 

    <echo>${ant.version}</echo> 
    <foobar bla="yada,yada" if:true="foo"/> 

</project> 

Ausgang, kein Fehler, aber macrodef nicht ausgeführt bekommt:

[echo] Apache Ant(TM) version 1.9.1 compiled on May 15 2013 
BUILD SUCCESSFUL 

Scheint, wie es noch einige Unstimmigkeiten in diesem Bereich sind, da diese Funktion ist neu versohlt.
Vielleicht sollten wir einen Fehler einreichen!?
- BEARBEITEN (1) -
Nur gefunden comment from 2007 by Peter Reilly (er hat das if/if-Feature implementiert) in der Ameisen-Bug-Datenbank, die ein Snippet mit einem Makrodef liefert.

- EDIT (2) -
Obwohl die neue Ant-Release 1.9.3 vom 29. Dezember 2013 (see releasenotes here) einen Fehler auf die neuen, wenn im Zusammenhang festgelegt: und es sei denn, Attribute (https://issues.apache.org/bugzilla/show_bug.cgi?id=55885) unser Problem bleibt . So habe ich einen Fehlerbericht geöffnet, siehe Ameisen-Bug-Datenbank bugid 55971.

- EDIT (3) -
Schließlich wird die Lösung gefunden wird. Neben dem Bugfix für Bugid 55885 der Ant Release 1.9.3 enthält auch einen Bugfix für die Dokumentation des neuen if: und sofern: Attribute =>Bugid 55359 zeigt, dass if:true="${propertyname}" anstelle von if:true="propertyname" verwendet werden muss.
So sollte Ihr Makro auf Ant 1.9.3 wie das nach dem Upgrade arbeiten:

<property name="test.templates"  value="true"/> 
.... 
<target name="test.templates" 
description="Test the autoconfiguration templates and answers"> 
    <test.templates 
    if:true="${test.templates}" 
    template.root.dir="${main.dir}" 
    answers.dir="${main.config.dir}"/> 
</target> 
+0

Vielen Dank für Ihre Arbeit! Wir benutzten die '' ''-Antitribute, aber ich dachte, dies wäre eine elegantere Art, das Problem zu lösen, war aber überrascht, als es nicht funktionierte. –

+0

@Rebse: Es wäre nett, wenn Sie diese Antwort editieren, um die Lösung an die Spitze statt an die Unterseite zu setzen (unter mehreren Nicht-Lösungen). Wenn nicht für dein "Ich habe es gelöst!" Kommentar zu der Frage, ich hätte Ihre Antwort aufgegeben, bevor Sie zu Ende gegangen sind. –

Verwandte Themen