【发布时间】:2010-12-24 02:40:10
【问题描述】:
我有一个现有的 Ant 项目,并希望加快构建过程 通过避免重新构建已经是最新的组件。
Ant 允许您指定一个目标依赖于另一个目标,但是通过 默认每个先决条件总是重建,即使它已经达到 日期。 (这是 Ant 和 make 之间的一个关键区别。默认情况下,make 仅在需要时重新构建目标 - 也就是说,如果某些先决条件是 较新。)
<uptodate property="mytarget.uptodate"> // in set.mytarget.uptodate task
...
</uptodate>
<!-- The prerequisites are executed before the "unless" is checked. -->
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate">
...
</target>
为了使 Ant 仅在必要时重新构建先决条件,似乎有两个 Ant 中的一般方法。
第一种方法是使用uptodate 任务来设置属性。然后,
只有当属性是(不是)时,您的任务才能测试属性并构建
设置。
<uptodate property="mytarget.uptodate"> // in set.mytarget.uptodate task
...
</uptodate>
<!-- The prerequisites are executed before the "unless" is checked. -->
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate">
...
</target>
另一种方法是使用来自 ant contrib 的 outofdate 任务。
更好的是,它只是一个目标,没有单独的属性
定义;相比之下,过时需要单独的目标来设定和
测试属性。
第二种方法是使用<modified> 创建一个<fileset>
选择器。它计算文件的 MD5 哈希值并选择其 MD5
不同于之前存储的值。可选设置
<param name="cache.cachefile" value="cache.properties"/>
在选择器内;它默认为“cache.properties”。这是 将所有文件从 src 复制到 dest 的示例,其内容具有 改变:
<copy todir="dest">
<fileset dir="src">
<modified/>
</fileset>
</copy>
这些都不是很令人满意,因为它需要我写 Ant 应该是自动的流程(避免重新构建)的代码。
还有 Ivy,但我无法从它的文档中判断它是否 提供此功能。常春藤文档中的关键用例似乎 从网上下载子项目而不是避免浪费 通过暂存单个项目的各个部分来工作。 Maven 提供了类似的 功能,在其文档中突出显示了相同的用例。 (将现有的 non-trivila 项目迁移到 Maven 据说是一场噩梦; 相比之下,使用 Maven 开始全新开发更容易接受。)
有没有更好的办法?
【问题讨论】:
标签: ant build-automation dependencies ivy