在ANT中,我具有以下目标的构建文件:INIT <-- CLEAN <-- COMPILE <-- TEST
我想通过从以前的构建中删除不必要的文件来保持构建环境的清洁。
问题是,在测试阶段,我想检查测试源是否与测试类一起更新,所以我不运行测试。要检查是否需要将最后的构建类与源文件进行比较,如下所示:
<uptodate property="tests.unnecessary">
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="glob" from="*.java" to="${build.dir}/classes/*.classes"/>
</uptodate>
因此,我想检查是否有必要进行测试,以及:
-如果是,请清理类并重新运行编译和测试;
-如果不是,则什么也不要做。
我怎样才能做到这一点?
最佳答案
您的uptodate
task示例很接近-您可能需要调整映射器,并注意绝对路径和相对路径。也许:
<uptodate property="tests.unnecessary">
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="glob" from="*.java" to="../${build.dir}/classes/*.class"/>
</uptodate>
请注意映射器
..
属性中的to=
-假定build.dir
在目录层次结构中与src
处于同一级别。还要注意,已编译的类具有扩展名.class
而不是'.classes'。完成上述操作后,就可以使用Ant targets的
if/unless
属性来控制执行。有很多方法,最基本的方法可能类似于以下方法。运行ant test
时,Ant将确定是否有任何文件已过期,并跳过清理,编译和测试(如果不是)的步骤。另一种方法可能是使用antcall
task从单个目标内调用一系列目标调用。<target name="check" depends="init">
<uptodate property="tests.unnecessary">
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="glob" from="*.java" to="${build.dir}/classes/*.class"/>
</uptodate>
</target>
<target name="init">
<echo message="Running init" />
</target>
<target name="clean" depends="check" unless="tests.unnecessary">
<echo message="Running clean" />
</target>
<target name="compile" depends="clean" unless="tests.unnecessary">
<echo message="Running compile" />
</target>
<target name="test" depends="compile" unless="tests.unnecessary">
<echo message="Running test" />
</target>