Какая разница между buildscript и allprojects в build.gradle?

В многопроектной сборке gradle может ли кто-нибудь сказать мне, что именно представляет собой различие между секцией "allprojects" и "buildscript"? Оба имеют задачу repositories и dependencies. Является allprojects для моего проекта? Что насчет buildscript?

buildscript {  
     repositories {
         ...
     }
     dependencies {
         ...
     }
}

и

allprojects(subprojects) { 
     repositories {
         ...
     }
     dependencies {
         ...
     }
}

Ответ 1

Раздел конфигурации "buildscript" предназначен для самого gradle (т.е. изменения того, как gradle может выполнить сборку). Таким образом, этот раздел обычно включает плагин Android gradle.

Раздел "allprojects" предназначен для модулей, построенных с помощью Gradle.

Часто раздел репозитория одинаковый для обоих, так как оба будут получать свои зависимости от jcenter обычно (или, может быть, maven central). Но раздел "зависимости" будет другим.

Обычно раздел "зависимостей" для "allprojects" пуст, так как зависимости для каждого модуля уникальны и будут находиться в файле "build.gradle" в каждом из модулей. Однако, если все модули имеют одинаковые зависимости, они могут быть перечислены здесь.

Ответ 2

TL; DR: buildscript помогает находить плагины, allprojects применяется ко всем проектам


https://docs.gradle.org/current/userguide/userguide_single.html#applyPluginBuildscript говорит

Двоичные плагины, которые были опубликованы как внешние файлы jar, могут быть добавлены в проект, добавив плагин в путь сборки script, а затем применив плагин.

Итак, вам нужно buildscript для gradle найти плагины, как

Gradle по своей сути намеренно обеспечивает очень мало для автоматизации реального мира. Все полезные функции, такие как возможность компиляции Java-кода, добавляются плагинами. Плагины добавляют новые задачи (например, JavaCompile), объекты домена (например, SourceSet), соглашения (например, источник Java находится в src/main/java), а также расширяют основные объекты и объекты из других плагинов.

Относительно allprojects:

API-интерфейс проекта предоставляет свойство allprojects, которое возвращает список с текущим проектом и всеми его подпроектами под ним. Если вы вызываете allprojects с закрытием, утверждения закрытия делегируются проектам, связанным с allprojects.