现在大家都在谈论Bazel,但是从Maven迁移到它并没有自动化(相较于Gradle而言,Gradle在这方面更好)。所以我不想花时间手动将任何存储库转换为它。
但我找不到任何关于最近版本的Gradle(5.6 >)和Bazel(1.0)之间构建速度差异的信息。
有人能分享链接或他自己的经验吗?我主要感兴趣的是增量构建,在这种情况下只有几个文件发生了变化。
Dropbox 最近 进行了一些基准测试:
请注意,对于Bazel而言,没有缓存的清洁构建方案明显较慢,而增量构建方案则明显更快。java_library
目标。这些构建单元中的命令行操作(也称为目标)会被单独缓存(本地或远程),并组合在一起构建一个java_binary
。javac
),当这些进程多次重新启动时,这些成本就会累加。Bazel具有一种称为持久化工作者的机制,其中针对各个操作的可执行进程(例如javac
、tsc
、scalac
或ghc
的编译器包装程序)可以在操作执行期间保留,从而节省启动时间,并在进程级别上实现更低级别的缓存。bazel clean
来实现,因为构建旨在具有隔离性、确定性和一致性。使用100%远程缓存命中的构建在Bazel中很常见。好的,我已经将包含约100,000行Java代码的闭源项目迁移到了Bazel。
Gradle 5.6.3 和 bazel 1.0.1
正如我所说,我的兴趣在于开发人员的生产力,因此也关注增量构建。
我在Bazel的BUILD中使用了以下内容,因此我没有使用最细粒度的方法,因为我认为这不是可维护的,并且除了拥有很多DevOps的大公司之外,任何人都无法使用。无论如何,我认为需要手动执行此操作以提高构建速度是Bazel的缺点之一。
java_binary(
srcs = glob(["src/main/java/**/*.java"]),
resources = glob(["src/main/resources/**"]),
...
)
一到两个文件的增量构建。
gradle - 1秒,bazel - 4.227秒
我尝试了多次,每次gradle都明显更快。我没有测试过当有一个或两个以上的文件被更改时的增量构建,也许在这种情况下bazel与gradle相同或更快。
无操作构建 gradle - 700毫秒,bazel - 0.090毫秒
因此,在开发者生产力方面,速度方面gradle似乎是赢家。Bazel具有更安全的默认设置(默认启用错误检测),而在gradle中,您必须自己启用它,但在我看来,gradle的灵活性超过了bazel的更多安全默认设置。