我有一个用 Ant 构建的构建脚本,它有一个宏定义,它接受一些默认参数、目标、根等,然后是可选的两个,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>
但是正如你所看到的,在这个时间点,对我来说效率很低,做我想做的事,我必须创建并传递至少一个文件集和多个类路径。我真正想做的只是传入一个目录列表,然后根据该信息动态创建 extrasrc-f 和 extrasrc-c 元素,但是对于我的生活,我不知道我是怎么做的我能够做到这一点。
我已经阅读了很多关于 Ant 和 Ant-Contrib 时髦类的信息,但是我还没有阅读任何可以让我做这样的事情的东西,我觉得这很奇怪,因为对我来说这看起来很明显。
我是以一种非常错误的方式处理这个问题,还是我遗漏了什么?如果我真的在滥用 Ant,我会喜欢关于如何正确执行此操作的正确方向的指针,创建一个包罗万象的模板构建在一个测试多个源的宏定义(或目标,如果这是唯一的方法)中文件针对一个构建的文件,同时还传递额外的类或库路径,最好在一个列表中。