3 Stimmen

wie man in Ant eine for-Schleife auf der Grundlage eines Limits ausführt

In Ant-contrib können wir etwas tun wie:

<for list="a,b,c,d" param="instence">

Wenn ich aber keine Liste habe, habe ich nur ein Limit, z.B. limit=4.

Gibt es eine Möglichkeit, for-Schleife basierend auf Grenze, wie zu tun:

<for limit="4" param="index">

3voto

Rajesh Guptan Punkte 207
<project name="Attachments" default="print">
    <property name="numAttachments" value="20" />
    <target name="generate">
        <script language="javascript"><![CDATA[
            var list = '1';
            var limit = project.getProperty( "numAttachments" );
            for (var i=2;i<limit;i++)
            { 
                list = list + ',' + i;
            }
            project.setNewProperty("list", list);            
        ]]>
        </script>    
    </target>
    <target name="print" depends="generate">
        <for list="${list}" param="letter">
            <sequential>
                <echo>Letter @{letter}</echo>
            </sequential>
        </for>
    </target>
</project>

2voto

atrain Punkte 9035

Es ist nicht genau das, was Sie wollen, aber diese Seite hat ein Beispiel. Im Wesentlichen geben Sie den Grenzwert als eine Liste von Zahlen ein. Es ist nicht elegant, aber es funktioniert.

Hier ist eine weitere Idee - siehe die Antwort von Benutzer "cn1h". Es ist ein cooler Weg, die Beschränkungen von ANT zu umgehen - ein Skript aus einer anderen Sprache einbetten, das das tun kann, was man will. Schön!

0voto

Bohne Punkte 4001

In antcontrib können Sie auch tun:

<for param="index" end="@{numberOfIterations}" start="1">

Beachten Sie jedoch eine Fehler : Es kann nicht damit umgehen, dass Anfang und Ende gleich sind. Wenn also "numberOfIterations" gleich 1 ist, erhalten Sie einen Fehler.

Wir haben eine Umgehung für diese, Überprüfung der Wert von numberOfIterations erste und nur, wenn seine nicht 1 tun die for-Anweisung.

<if><equals  arg1="1" arg2="@{numberOfIterations}"/>
<then>
   ....
</then>
<else>
   <for param="index" end="@{numberOfIterations}" start="1">
   ....
</else>
</if>

-1voto

Rebse Punkte 10227

Die Ameisenerweiterung Flaka bietet einige Lösungen für Ihr Problem.

1) Verwenden Sie eine while-Schleife

das Attribut test wertet einen EL-Ausdruck aus,
die ein einfacher Zähler sein kann, z. B.

<project name="demo" xmlns:fl="antlib:it.haefelinger.flaka">

 <!-- some counter -->
 <fl:let>
  countdown = 3
 </fl:let>

 <fl:while test=" countdown >= 0 ">
  <fl:echo>
   #{countdown > 0 ? countdown : 'bang!' }..
  </fl:echo>
  <fl:let>
   countdown = countdown - 1
  </fl:let>
 </fl:while>

</project>

Ausgabe:

  [fl:echo] 3..
  [fl:echo] 2..
  [fl:echo] 1..
  [fl:echo] bang!..

oder ein anderer Ausdruck, z.B. die Prüfung auf das Vorhandensein einer Datei, bedeutet eine Schleife, bis eine Datei existiert:

 <fl:while test=" !'/home/rosebud/stop'.tofile.isfile ">
  <fl:echo>
   still working..
  </fl:echo>
 </fl:while>

2) Verwenden Sie eine for-Schleife mit break oder continue :

<project name="demo" xmlns:fl="antlib:it.haefelinger.flaka">

 <fl:for var="i" in=" list(1,2,3,4,5,6) ">
    <fl:echo>i = #{i}</fl:echo>
    <fl:break test=" i == 3 " />
 </fl:for>

  <fl:for var="i" in=" list(1,2,3,4,5,6) ">
    <fl:continue test=" i > 3 " />
    <fl:echo>i = #{i}</fl:echo>
 </fl:for>

</project>

was zu demselben Ergebnis führt:

  [fl:echo] i = 1
  [fl:echo] i = 2
  [fl:echo] i = 3

Weitere Einzelheiten finden Sie in der Flaka-Handbuch

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X