Gradle отключить все инкрементные компиляции и параллельные сборки

В небольшом наборе проектов 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

Попробуйте добавить

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

к файлу gradle.properties, он может помочь вам в вашей проблеме.

Ответ 2

Параллельное построение не включено по умолчанию в Gradle. Тем не менее, чтобы явно отключить параллелизм, вы можете добавить

org.gradle.parallel=false

в свой проект gradle.properties или укажите параметр --no -rallel для команды gradle/gradlew, которая запускает сборку.


Важным примечанием здесь является то, что для определенных версий Gradle, таких как 4.6 и 4.7 и других, отключение параллельного выполнения не работает. Обходной путь - указать очень ограниченное количество рабочих потоков. По умолчанию максимальное количество рабочих потоков равно числу ваших системных процессоров.

Поэтому в проекте gradle.properties добавьте значение

org.gradle.workers.max=1

чтобы ограничить число одновременных рабочих потоков до 1 или указать параметр --max-worker = 1 для команды gradle/gradlew, которая инициирует сборку.


В версиях, предшествующих Gradle 4.10, добавочное построение не включено по умолчанию. Для версий после 4.10 вы можете добавить следующее в свой build.gradle (скорее всего, в файл верхнего уровня в многомодульном проекте), чтобы отключить инкрементную компиляцию Java:

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