【问题标题】:Avoiding re-building prerequisites in Ant避免在 Ant 中重新构建先决条件
【发布时间】: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 任务。 更好的是,它只是一个目标,没有单独的属性 定义;相比之下,过时需要单独的目标来设定和 测试属性。

第二种方法是使用&lt;modified&gt; 创建一个&lt;fileset&gt; 选择器。它计算文件的 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


    【解决方案1】:

    这种大型构建的条件编译是 make 的一个功能,我最初在 ANT 中错过了它。我建议不要使用目标依赖项,而是将您的大型项目分成更小的模块,每个模块都发布到一个公共共享存储库。

    然后可以使用 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>
    

    ivy:retrieve 任务只会下载/复制已更改的子模块之一(从其构建文件发布)

    这听起来更复杂,但也许您已经在构建文件中细分项目......例如,如果您的 ANT uptodate 任务依赖于构建人工制品。

    【讨论】:

    • 这行得通。它确实需要以精细的粒度对我继承的项目进行完全重新架构,在某些情况下,将其转换为不自然地作为独立实体的子项目。这正是我所担心的。
    • 查看 buildlist IVY 任务。这可以根据各种项目组件的声明依赖关系控制您的整体项目构建。是的,您的项目需要重组,但您可能会发现它简化了构建过程并提高了整体架构的可见性。这是一个个案电话
    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多