私は Ant で構築されたビルド スクリプトを持っています。これには、target、root などのいくつかのデフォルト パラメータと、オプションの 2 つの extrasrc-f と extrasrc-c を受け取るマクロ定義があります。それらが入ってきたら、関連するすべてのリソースを最新の状態にチェックし、ターゲットが古くなっている場合にのみビルドを行います。
現時点で持っているものは、
<?xml version="1.0" encoding="UTF-8"?>
<project name="Custom build" default="default">
<taskdef resource="net/sf/antcontrib/antlib.xml"
classpath="C:/dev/ant/ant-contrib/ant-contrib-1.0b3.jar"/>
<macrodef name="checkuptodate">
<attribute name="target" />
<element name="resource" />
<sequential>
<condition property="needbuild">
<and>
<resourcecount when="greater" count="0"> <resource /> </resourcecount>
<not>
<uptodate targetfile="@{target}">
<srcresources> <resource /> </srcresources>
</uptodate>
</not>
</and>
</condition>
</sequential>
</macrodef>
<macrodef name="projbuild">
<attribute name="root" />
<attribute name="target" />
<element name="extrasrc-f" optional="true" />
<element name="extrasrc-c" optional="true" />
<sequential>
<local name="needbuild" />
<checkuptodate target="@{root}/bin/@{target}">
<resource>
<union>
<extrasrc-f />
<fileset dir="@{root}/src" includes="**/*.java" />
</union>
</resource>
</checkuptodate>
<if>
<istrue value="${needbuild}" />
<then>
<javac
srcdir="@{root}/src"
destdir="@{root}/bin"
includeantruntime="false"
>
<extrasrc-c />
</javac>
</then>
</if>
</sequential>
</macrodef>
<target name="default">
<projbuild root="." target="EntryPoint.class">
<extrasrc-f>
<fileset dir="Proj2/src" includes="**/*.java" />
<fileset dir="Proj3/src" includes="**/*.java" />
</extrasrc-f>
<extrasrc-c>
<classpath location="Proj2/src" />
<classpath location="Proj3/src" />
</extrasrc-c>
</projbuild>
</target>
</project>
しかし、おわかりのように、現時点では、やりたいことを行うには非効率的です。少なくとも 1 つのファイルセットと複数のクラスパスを作成して渡す必要があります。私が本当にやりたいことは、ディレクトリのリストを渡し、その情報からその場で extrasrc-f および extrasrc-c 要素を作成することですが、私の人生では、どうすればよいのかわかりません.私はそれを行うことができます。
私は Ant と Ant-Contrib のファンキーなクラスの多くについてたくさん読んだことがありますが、このようなことを可能にするようなものは読んだことがありません。
私はこれに非常に間違った方法で取り組んでいますか、それとも欠けているものがありますか? Ant を本当に誤用している場合は、これを適切に行う方法について正しい方向へのポインタが欲しいです。複数のソースをテストするマクロ定義 (または、それが唯一の方法である場合はターゲット) でキャッチオール テンプレート ビルドを作成します。追加のクラスまたはライブラリ パスも、できれば 1 つのリストで渡します。