46

Antタスクに使用できるif/else条件はありますか?

これは私がこれまでに書いたものです:

<target name="prepare-copy" description="copy file based on condition">
        <echo>Get file based on condition</echo>
    <copy file="${some.dir}/true" todir="."  if="true"/>
</target>

上記のスクリプトは、条件が真の場合にファイルをコピーします。条件がfalseで、別のファイルをコピーしたい場合はどうなりますか?Antでそれは可能ですか?

上記のタスクにパラメータを渡して、渡されたパラメータが

4

5 に答える 5

44

if属性は存在しません<copy>。に適用する必要があり<target>ます。

以下は、dependsターゲットの属性とifandunless属性を使用して、依存するターゲットの実行を制御する方法の例です。2つのうち1つだけを実行する必要があります。

<target name="prepare-copy" description="copy file based on condition"
    depends="prepare-copy-true, prepare-copy-false">
</target>

<target name="prepare-copy-true" description="copy file based on condition"
    if="copy-condition">
    <echo>Get file based on condition being true</echo>
    <copy file="${some.dir}/true" todir="." />
</target>

<target name="prepare-copy-false" description="copy file based on false condition" 
    unless="copy-condition">
    <echo>Get file based on condition being false</echo>
    <copy file="${some.dir}/false" todir="." />
</target>

ANT 1.8以降を使用している場合は、プロパティ展開を使用でき、プロパティの値を評価してブール値を決定します。if="${copy-condition}"したがって、の代わりに使用できますif="copy-condition"

ANT 1.7.1以前では、プロパティの名前を指定します。プロパティが定義されていて、任意の値(空の文字列であっても)がある場合、trueと評価されます。

于 2013-01-24T12:18:40.527 に答える
22

antcontribのiftaskを使用してこれを行うこともできます。

<if>
    <equals arg1="${condition}" arg2="true"/>
    <then>
        <copy file="${some.dir}/file" todir="${another.dir}"/>
    </then>
    <elseif>
        <equals arg1="${condition}" arg2="false"/>
        <then>
            <copy file="${some.dir}/differentFile" todir="${another.dir}"/>
        </then>
    </elseif>
    <else>
        <echo message="Condition was neither true nor false"/>
    </else>
</if>
于 2013-01-24T19:21:16.333 に答える
16

ターゲットの条件を使用する風変わりな構文(Madsによって記述されている)は、コアANTで条件付き実行を実行するためにサポートされている唯一の方法です。

ANTはプログラミング言語ではないため、状況が複雑になると、次のようにビルド内にスクリプトを埋め込むことにします。

<target name="prepare-copy" description="copy file based on condition">
    <groovy>
        if (properties["some.condition"] == "true") {
            ant.copy(file:"${properties["some.dir"]}/true", todir:".")
        }
    </groovy>
</target>

ANTはいくつかの言語をサポートしています(スクリプトタスクを参照)。構文が簡潔で、ビルドで非常にうまく機能するため、私の好みはGroovyです。

申し訳ありませんが、David私はant-contribのファンではありません。

于 2013-01-24T20:13:22.387 に答える
10

ant 1.9.1以降、if:set条件を使用できます:https ://ant.apache.org/manual/ifunless.html

于 2016-01-13T10:42:00.683 に答える
0
<project name="Build" basedir="." default="clean">
    <property name="default.build.type" value ="Release"/>

    <target name="clean">
    <echo>Value Buld is now  ${PARAM_BUILD_TYPE} is set</echo>
        <condition property="build.type" value="${PARAM_BUILD_TYPE}" else="${default.build.type}">
            <isset property="PARAM_BUILD_TYPE"/>
        </condition>

       <echo>Value Buld is now  ${PARAM_BUILD_TYPE} is set</echo>
       <echo>Value Buld is now  ${build.type} is set</echo>
    </target>
</project>

私の場合DPARAM_BUILD_TYPE=Debug、それが提供されている場合は、デバッグ用にビルドする必要があります。それ以外の場合は、リリースビルドのビルドに進む必要があります。私はそれが機能した上記の条件のように書き、私はそれが私のためにうまく機能していることを以下のようにテストしました。

そして${build.type}、これを他のターゲットまたはmacrodefに渡して、他のantmacrodefで実行している処理を行うことができます。

D:\>ant -DPARAM_BUILD_TYPE=Debug
Buildfile: D:\build.xml
clean:
     [echo] Value Buld is now  Debug is set
     [echo] Value Buld is now  Debug is set
     [echo] Value Buld is now  Debug is set
main:
BUILD SUCCESSFUL
Total time: 0 seconds
D:\>ant
Buildfile: D:\build.xml
clean:
     [echo] Value Buld is now  ${PARAM_BUILD_TYPE} is set
     [echo] Value Buld is now  ${PARAM_BUILD_TYPE} is set
     [echo] Value Buld is now  Release is set
main:
BUILD SUCCESSFUL
Total time: 0 seconds

条件を実装するのは私にとってはうまくいくので、投稿されたものが役立つことを願っています。

于 2015-12-13T06:47:33.370 に答える