我有一个现有的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
任务。
它更好,因为它只是一个没有单独属性的目标
定义;相比之下,outofdate需要单独的目标设置和
测试财产。
第二种方法是使用<fileset>
创建<modified>
选择。它计算文件的MD5哈希值并选择MD5的文件
与早期存储的值不同。设置
<param name="cache.cachefile" value="cache.properties"/>
在选择器内;它默认为“cache.properties”。这是 将所有文件从src复制到其内容所具有的dest的示例 改变:
<copy todir="dest">
<fileset dir="src">
<modified/>
</fileset>
</copy>
这些都不是很令人满意,因为它需要我写Ant 一个应该是自动的过程的代码(避免重建)。
还有常春藤,但我无法从文档中看出它是否存在 提供此功能。似乎常春藤文档中的关键用例 从互联网下载子项目而不是避免浪费 通过暂存单个项目的各个部分来完成工作。 Maven提供类似的 功能,在其文档中突出显示相同的用例。 (将现有的非特里维拉项目移至Maven据说是一场噩梦; 相比之下,使用Maven开始绿地开发更加可口。)
有更好的方法吗?
答案 0 :(得分:1)
这个大型构建的条件编译是我在 ANT 中最初遗漏的 make 的一个特性。我建议不要使用目标依赖项,而是将大型项目划分为更小的模块,每个模块都发布到一个公共共享存储库。
然后可以使用Ivy来控制项目主模块使用的组件版本。<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="multi_module_project"/>
<publications>
<artifact name="main" type="jar"/>
</publications>
<dependencies>
<dependency org="com.myspotontheweb" name="component1" rev="latest.integration"/>
<dependency org="com.myspotontheweb" name="component2" rev="latest.integration"/>
<dependency org="com.myspotontheweb" name="component3" rev="latest.integration"/>
<dependency org="com.myspotontheweb" name="component4" rev="latest.integration"/>
</dependencies>
</ivy-module>
常春藤:检索任务只会下载/复制其中一个子模块(如果已更改(从其构建文件发布))
这听起来更复杂,但也许你已经在构建文件中对项目进行了细分......例如,如果您的ANT uptodate 任务依赖于构建文件伪影。