避免在Ant中重建先决条件

时间:2009-12-07 17:36:20

标签: 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>

要使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开始绿地开发更加可口。)

有更好的方法吗?

1 个答案:

答案 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 任务依赖于构建文件伪影。