在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 targetsif/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>

10-01 11:36
查看更多