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

2022-09-03 01:55:48

在一小部分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 编译呢?


答案 1

默认情况下,在 Gradle 中不启用 Parrallel 构建。也就是说,为了明确禁用parrallelism,您可以添加

org.gradle.parallel=false

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


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

因此,在项目的 gradle.properties 中添加值

org.gradle.workers.max=1

以便将并发工作线程数限制为 1,或在启动构建的 gradle/gradlew 命令中指定选项 --max-workers=1


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

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

答案 2

尝试添加

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

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


推荐