【发布时间】:2014-05-31 10:06:09
【问题描述】:
tl;dr 版本: 有没有办法告诉 ant/maven/gradle 跟踪文件依赖关系,并且只重建过时的文件,即比它们的依赖关系更旧的文件?
以下长版:
我是如何在 C/C++ 中做到的
我多年来一直使用make 来开发 C/C++。虽然有时它可能很麻烦,但它至少为我做了一件最重要的事情:它跟踪文件依赖关系,并且只有在其任何依赖关系比文件本身更新时才重建文件。这很棒,它大大减少了构建时间,尤其是在执行大量代码生成工具时。
我在我的项目中使用了大量的代码生成。但是,代码生成需要一些时间,并且生成的代码必须在之后进行编译,因此浪费了更多时间。大多数生成的代码仅依赖于少量文件,例如生成解析器时的语法规范。使用make,我只需将依赖项设置为规范文件,并且仅在规范更改时重新构建解析器。在我的一些项目中,生成代码需要完全重建所需时间的 80-90%。因此,无需重新生成生成的代码,我的构建过程几乎可以加快 10 倍。
现在到 java
人们不会将make 用于java,所以即使我喜欢make,我也会为我的java 项目使用常用的java 构建工具。我尝试的构建工具(ant、gradle、maven)似乎不提供这种依赖跟踪。相反,它们依赖于调用的应用程序或任务来执行此操作(例如,ant copy 任务仅复制过时的文件)。但是,我使用的代码生成程序根本不提供此类检查。无论输入规范是否过时,它们总是执行完整的代码生成。
因此,我在 java 中的构建时间变得越来越长。它们的时间太长了,以至于我将代码生成从通常的构建周期中取出到一个单独的目标中,并且仅在更改任何规范文件后手动执行该目标。但是,当然,这很容易出错,因为我有时会忘记它。我的构建过程现在感觉完全有缺陷。
最后,我的问题
有没有办法在我提到的任何我不知道的构建工具(ant、gradle、maven)中执行依赖项跟踪和仅重建过时的文件?
如果不是,那为什么?为什么java社区似乎不关心这个特性?尤其是在涉及大量代码生成的情况下,这样的功能非常重要,尤其是在所使用的代码生成工具本身不提供该功能的情况下。
如果没有,那么是否还有其他具有此类跟踪功能的 java 构建工具?
【问题讨论】:
标签: java maven ant build gradle