我有一个 ant
构建脚本,可以构建许多 android
项目。
我正在按照文本文件中的属性给我的特定顺序构建所有项目。
ant
构建脚本调用每个项目自己的 build.xml
文件来构建该项目。
如果项目构建失败,我如何让 ant
从因错误而停止的地方继续构建?
基本上,如果我正在构建项目 A
、B
、C
、D
和 E
。构建过程在 C
失败,当开发人员再次开始构建时,我该怎么做才能让构建过程在 C
继续?
此外,构建过程需要重新构建开发人员更改的内容。例如,C
中的问题是因为 A
中的问题,而 C
依赖于 A
。因此,它需要重建 A
,跳过 B
,重建 C
并继续。 o.O
正在寻找想法,或者是否已经有这样做的东西。
谢谢!
最佳答案
Ant 和 Make 一样,非常擅长在您离开时确定从哪里继续。 <javac>
除非更新源,否则任务不会重新编译代码。 <copy>
默认情况下,任务不会重新复制文件。但是,如果您将构建分成多个文件,然后使用 <ant>
任务而不是使用 depends
你的参数 <target>
,你会破坏这个系统。
假设您有独立的项目A、B、C 和D。你所有的build.xml
所做的是在每个目标中调用正确的目标。假设每个构建一个 jar 文件。由于 Java 错误,该过程在项目 C 上中断。开发人员修复了它。你运行你的 build.xml
再次,它将再次调用项目 A 和 B。然而,由于这些项目已经建成,他们不应该做任何事情。您会看到对 A 和 B 的调用,但什么也不会发生。
即使在项目 C 中,构建过程也会从它停止的地方开始。也就是说,如果您没有采取任何措施来破坏 Ant 计算其构建的能力。
破解Ant的方法有很多。例如,不要在构建过程中删除文件。如果目标文件不再存在,Ant 无法使用时间戳来确定要做什么。
有时,一个过程需要一点帮助来避免构建。 Ant 有一个内置的 <uptodate>
任务,但我找到了 <outofdate>
更容易使用。例如,假设项目 A 生成项目 B 使用的 jar 文件。如果 jar 中使用的类文件和资源早于 jar 上的时间戳,您可能希望使用这些任务之一不复制该 jar。
否则,如果您只是盲目地将 jar 复制到项目 B,项目 B 将看到类文件所依赖的文件已更新。因此,Project B 将重新编译所有内容。然后复制所有内容,并重建它正在构建的任何 jar 或 war。我遇到了 third party task 的问题直接更新 Java 类文件,并且必须使用监视文件来确保我没有运行两次编译,尤其是修改类文件的任务。
顺便说一下,不要对 Ant 所说的正在执行的目标感到不安。 Ant 将执行这些目标,但组成这些目标的任务将不会运行,除非更新了某些内容。
更新:使用<outofdate>
来自 Ant 贡献
假设在您的主项目文件中,您有以下目标:
<target name="build"
description="Builds every sub project">
<ant antfile=${project.a.dir}/build.xml target="build"/>
<ant antfile=${project.b.dir}/build.xml target="build"/>
<ant antfile=${project.c.dir}/build.xml target="build"/>
<ant antfile=${project.d.dir}/build.xml target="build"/>
使用 <outofdate>
:
<target name="build"
description="Builds every sub project">
<outofdate>
<sourcefiles>
<fileset dir="${project.a.srcdir}"/>
</sourcefiles>
<targetfiles>
<fileset dir="${project.a.dir}/target">
<include name="*.jar"/>
</fileset>
</targetfiles>
<sequential>
<ant antfile=${project.a.dir}/build.xml
target="build"/>
</sequential>
</outofdate>
<outofdate>
<sourcefiles>
<fileset dir="${project.b.srcdir}"/>
</sourcefiles>
<targetfiles>
<fileset dir="${project.a.dir}/target">
<include name="*.jar"/>
</fileset>
</targetfiles>
<sequential>
<echo>CALLING PROJECT: ${project.b.dir}</echo>
<ant antfile=${project.b.dir}/build.xml
target="build"/>
</sequential>
</outofdate>
<etc, etc, etc/>
如果设置正确,您可能可以在 Ant-Contrib 中完成所有操作 <for>
循环,因此您不必为每个子项目都执行此操作。
我不知道这样会不会更快。 <outofdate>
任务仍然必须遍历所有文件并进行日期比较,但至少您不会看到它调用子项目文件中的所有目标。
关于java - 在构建错误后从 ANT 停止的地方继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13076743/