Gradle buildscript зависимости

176

В чем разница между объявлением репозиториев в buildScriptразделе сборки gradle или на корневом уровне сборки.

Опция 1:

build.gradle :

buildScript {
    repositories {
        mavenCentral();
    }
}

или

build.gradle :

repositories {
    mavenCentral();
}
Джефф Стори
источник

Ответы:

165

Репозитории в блоке buildScript используются для извлечения зависимостей ваших зависимостей buildScript. Это зависимости, которые помещаются в classpath вашей сборки и на которые вы можете ссылаться из вашего файла сборки. Например, дополнительные плагины, которые существуют в Интернете.

Репозитории на корневом уровне используются для получения зависимостей, от которых зависит ваш проект. Так что все зависимости вам нужны для компиляции вашего проекта.

Hiery Nomus
источник
19
Если мне нужен maven central для моего buildscript и проекта, нужно ли мне объявлять его дважды?
Марцин Козиньски,
18
Да, вам нужно указать это дважды, тогда действительно.
Hiery Nomus
В качестве примера можно добавить плагин Spring propdeps в buildscript, чтобы включить «предоставленные» и «необязательные» ключевые слова для зависимостей в дополнение к обычным ключевым словам «compile» и «testCompile». Примечание: плагин war уже предлагает ключевое слово «available», вам просто нужны propdeps для проектов jar, которые будут развернуты в войне.
Powerlord
14

Я хочу дать вам четкое представление. По этой причине я прилагаю код снимка build.grade для лучшего понимания.

зависимости buildscript:

buildscript {
    repositories {
        maven { url("https://plugins.gradle.org/m2/") }
    }

    dependencies {
        classpath 'net.saliman:gradle-cobertura-plugin:2.3.2'
        classpath 'com.netflix.nebula:gradle-lint-plugin:latest.release'
    }
}

корень / основной уровень зависимости:

repositories{
    mavenLocal()
    maven { url("https://plugins.gradle.org/m2/") }
    maven { url "https://repo.spring.io/snapshot" }
}

dependencies {
        //Groovy
        compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.3.10'

        //Spock Test
        compile group: 'org.spockframework', name: 'spock-core', version: '1.0-groovy-2.3'

        //Test
        testCompile group: 'junit', name: 'junit', version: '4.10'
        testCompile group: 'org.testng', name: 'testng', version: '6.8.5'
}

Итак, сначала я хочу уточнить одним словом, что

i) файл jar зависимостей buildscript будет загружен из репозиториев buildscript. [Внешняя зависимость проекта]

ii) файл jar зависимостей корневого уровня будет загружен из хранилищ корневого уровня. [Для зависимости проекта]

Вот,

Блок «buildscript» управляет только зависимостями для самого процесса buildscript, а не для кода приложения. Как различный плагин Gradle gradle-cobertura-plugin, gradle-lint-pluginможно найти в репозиториях buildscript. Эти плагины не будут ссылаться как зависимости для кода приложения.

Но для компиляции проекта и запуска теста jar-файлы, такие как groovy all jar, junit and testng jarбудут найдены в репозиториях корневого уровня.

И еще , maven { url("https://plugins.gradle.org/m2/") }порция может быть использована в обоих блоках. Потому что они используются для разных зависимостей.

Ссылка на ресурс: Разница между зависимостями в закрытии buildscript и ядром

Ходящий по небу
источник
12

Сценарий сборки (т. Е. Build.gradle) может иметь некоторые зависимости для выполнения самого сценария сборки. Вы бы заключили эти зависимости в блок buildScript. Глава 4 Gradle Beyond the Basics описывает это подробно.

user3240644
источник