mer*_*nst 5 ant build-automation dependencies ivy
我有一个现有的 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>
Run Code Online (Sandbox Code Playgroud)
为了让 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>
Run Code Online (Sandbox Code Playgroud)
第一种替代方法是使用outofdateant contrib 中的任务。更好的是它只是一个目标,没有定义单独的属性;相比之下,过时需要单独的目标来设置和测试属性。
<fileset>第二种方法是使用选择器创建一个<modified>
。它计算文件的 MD5 哈希值并选择 MD5 与之前存储的值不同的文件。可以随意设置
<param name="cache.cachefile" value="cache.properties"/>
Run Code Online (Sandbox Code Playgroud)
选择器内部;它默认为“cache.properties”。以下示例将内容已更改的所有文件从 src 复制到 dest:
<copy todir="dest">
<fileset dir="src">
<modified/>
</fileset>
</copy>
Run Code Online (Sandbox Code Playgroud)
这些都不是很令人满意,因为它要求我为应该是自动的进程编写 Ant 代码(避免重新构建)。
还有Ivy,但从它的文档中我无法判断它是否提供此功能。Ivy 文档中的关键用例似乎是从 Internet 下载子项目,而不是通过暂存单个项目的各个部分来避免浪费工作。Maven 提供了类似的功能,并在其文档中突出显示了相同的用例。(据说将现有的重要项目迁移到 Maven 是一场噩梦;相比之下,使用 Maven 开始绿地开发则更容易接受。)
有没有更好的办法?
这种大型构建的条件编译是我最初在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>
Run Code Online (Sandbox Code Playgroud)
ivy :retrieve任务只会下载/复制已更改的子模块之一(从其构建文件发布)
这一切听起来更复杂,但也许您已经在构建文件中细分了项目......例如,如果您的 ANT更新任务依赖于构建工件之一。
| 归档时间: |
|
| 查看次数: |
1870 次 |
| 最近记录: |