Ant - 我如何运行相同的取决于多个目标

时间:2014-05-08 14:44:08

标签: ant

有没有办法让ant多次执行多个依赖目标。考虑一下:

<target name="buildall" depends="mycommon,myDAO" />

<target name="myCommon" depends="initCommon, clean, makedir, compile" description="">
    <echo> Build completed for myCommon </echo>
</target>

<target name="myDAO" depends="initDAO, clean, makedir, compile" description="">
    <echo> Build completed for myDao </echo>
</target>

我想buildAll调用myCommon,调用initCommon,clean,makedir,编译,然后调用myDAO调用initDAO,clean,makedire,编译。

所以我希望多次执行clean,makedir和compile任务。它们是通用的,基于initXXX任务中设置的属性运行。

我试过了:

<target name="buildall">
    <antcall  target="myCommon" />
    <antcall target="myDao" />
</target>

但每次都会在任务之外运行一切,这不是我想要的。有什么想法吗?

1 个答案:

答案 0 :(得分:7)

首先:不要使用<antcall/>这通常表明你做错了。

现在,要了解Ant不是一种编程语言,您可以告诉Ant您想要做什么以及您希望它完成的顺序。 Ant是一种矩阵依赖语言。你只是告诉Ant你想要什么(我想建立这个jar),让Ant弄清楚它应该做什么。 Ant尽最大努力 多次运行目标。

例如,myCommonmyDAO都会调用clean目标。 Ant正式指出,两者都需要clean目标,然后在运行两个目标之前只调用clean一次。这就是Ant假设工作的方式。

所以,让Ant做好自己的工作。首先,在正常情况下你不能清理。构建是为了最小化重建以加速任务。如果您尚未修改*.java文件,为什么要强制我重建相应的*.class文件?

第二:不要加倍依赖:例如,如果我想构建目标myDAO,我想编译代码(可能构建一个jar或战争)。那是我myDAO所有目标应该依赖的。现在,当我编译时,我可能需要创建我的目录,当我创建我的目录时,我可能需要执行我的init:

<target name="clean">
    <echo>Clean up my working directory to be nice and sparkly</echo>
</target>
<target name="initDAO">
    <echo>Initialize stuff for my DAO build</echo>
    <echo>Maybe setup some properties?</echo>
</target>
<target name="makedir"
     depends="initDAO">
    <echo>I need my directories for building.</echo>
    <echo>But first, I need to setup stuff"</echo>
</target>
<target name="compile"
    depends="makedir">
    <echo>I need to compile my dao source"</echo>
    <echo>But first, I need to make the necessary directories</echo>
<target>
<target name="myDAO"
    depends="compile">
    <echo>Here's where I package up my DAO</echo>
    <echo>But I have to compile stuff before I can package it</echo>
</target>

注意上述结构。如果我运行目标myDAO,Ant将查看依赖项,然后运行initDAOmakedir,编译,最后myDAO将所有内容打包。再一次,我有一个clean目标,它将我的工作空间恢复到原始状态(在构建任何东西之前)条件,但我不会将其称为包的一部分,因为我不想重做工作。 / p> <啊>“啊!”,你说,“但我必须清理,因为myCommonmyDAO使用相同的目录进行建筑和包装。”

好吧不要那样做。相反,请确保您的两个程序包使用不同的目标目录进行构建和打包。这样,您就不必将混乱清理干净。而且,您可以更改单个源文件,重建,而不必再次重新编译所有内容。

通过定义macros来处理两者之间的共同点,可以避免麻烦。例如,您可以定义一个编译宏,该编译宏将源目录的名称作为其参数,它将根据该源目录名创建一个destdir,并编译您的公共和DAO目标。

所以,让Ant发挥其魔力。使用依赖关系不是告诉Ant如何做某事,而只是告诉Ant特定目标依赖于另一个目标。让Ant弄清楚执行的顺序。另外,不要将任务设置为要求您擦除目录并重新初始化所有内容。您希望Ant不必重建或重新复制未更改的文件,从而帮助最小化构建。