web-dev-qa-db-ja.com

Ant if else条件?

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>

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

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

40
jonney

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

以下は、ターゲットのdepends属性と ifおよびunless属性 を使用して、依存ターゲットの実行を制御する方法の例です。 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と評価されます。

39
Mads Hansen

ant contrib's if task でこれを行うこともできます。

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

ターゲットの条件を使用した風変わりな構文(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はいくつかの言語をサポートしています( script taskを参照)。私の好みは Groovy です。簡潔な構文であり、ビルドで非常にうまく機能するためです。

謝罪、デビッド私は ant-contrib のファンではありません。

14
Mark O'Connor

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

8
Vincent Rich
<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}これを、他のant macrodefで行っている処理のために、他のターゲットまたはmacrodefに渡すことができます。

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

条件を実装するのに役立ちますので、投稿してください。

0
Laxman G