Gradle 禁用所有增量编译和并行构建

Gradle disable all incremental compilation and parallel builds

在一小部分 sbt 项目中,我们需要一个 protobuf/grpc 编译,因为只有 Gradle 有正常的支持,我们用它来完成与 protobuf 相关的任务。

有时它会随机地编译完全相同的东西失败并在重试时成功,我们确定这是因为增量 Java 编译。

我想禁用各种孵化功能和增量编译,我希望这个东西是确定性的。

为此我尝试了

compileJava {
    //enable compilation in a separate daemon process
    options.fork = false

    //enable incremental compilation
    options.incremental = false
}

但是Gradle仍然会给出这样的输出(显然忽略了那些标志)

Parallel execution is an incubating feature.
Incremental java compilation is an incubating feature.
:deleteGeneratedSource
:clean
:extractIncludeProto
:extractProto UP-TO-DATE
:generateProto
:recompileProto

那么我们如何禁用并行执行和增量Java编译?

尝试添加

org.gradle.daemon=false
org.gradle.parallel=false

gradle.properties文件,它可以帮助你解决你的问题。

在 Gradle 中默认不启用平行构建。也就是说,为了明确禁用并行性,您可以添加

org.gradle.parallel=false

添加到项目的 gradle.properties 文件中,或者为启动构建的 gradle/gradlew 命令指定 --no-parallel 选项。


此处重要说明,对于某些版本的 Gradle,如 4.6 和 4.7 以及其他版本,禁用并行执行无效。 解决方法是指定数量非常有限的工作线程。默认情况下,最大工作线程数等于系统处理器的数量。

所以在项目的gradle.properties中添加值

org.gradle.workers.max=1

为了将并发工作线程数限制为1或指定选项--max-workers=1到启动构建的gradle/gradlew命令.


在Gradle 4.10 之前的版本中,默认不启用增量构建。对于 4.10 之后的版本,您可以将以下内容添加到您的 build.gradle(最有可能添加到多模块项目中的顶层)以禁用增量 Java 编译:

tasks.withType(JavaCompile) {
    options.incremental = false
}