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で可能ですか?
上記のタスクにパラメーターを渡し、渡されたパラメーターが
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と評価されます。
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>
ターゲットの条件を使用した風変わりな構文(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 のファンではありません。
Ant 1.9.1以降、if:set条件を使用できます: https://ant.Apache.org/manual/ifunless.html
<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
条件を実装するのに役立ちますので、投稿してください。