Назначение блока buildscript в Gradle

236

Я новичок в Gradle, и я читаю документацию, но я не понимаю некоторые ее части. Одна из этих частей связана с buildscriptблоком. Какова его цель?

Если вашему сценарию сборки необходимо использовать внешние библиотеки, вы можете добавить их в путь к классам сценария в самом сценарии сборки. Вы делаете это, используя метод buildscript (), передавая замыкание, которое объявляет путь к классу сценария сборки.

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
  }
}

Хорошо, но какая разница с:

repositories {
  mavenCentral()
}
dependencies {
  compile group: 'commons-codec', name: 'commons-codec', version: '1.2'
}

Например, почему это необходимо использовать buildscript?

Xelian
источник
1
возможный дубликат зависимостей
сборки

Ответы:

178

buildScriptБлок определяет , какие плагин, классы задач, а также другие классы доступны для использования в остальной части сценария сборки . Без buildScriptблока вы можете использовать все, что поставляется с Gradle "из коробки". Если вы дополнительно хотите использовать сторонние плагины, классы задач или другие классы (в сценарии сборки!), Вы должны указать соответствующие зависимости в buildScriptблоке.

Питер Нидервизер
источник
2
Я не могу понять Эм. Я написал класс задачи с группой: sample.infotask', name: 'infotask', version: '1.0'И используйте задачу _uploadArchives для загрузки ее в локальное хранилище ../lib ' В другом проекте, если я использую свою задачу, я должен написать: `buildscript {repositories {maven {url' file: ../ lib '}} зависимости {группа пути к классам:' sample.infotask ', имя:' infotask ', версия:' 1.0 '}} Я прав? Почему мы должны использовать блок buildScript ? Когда я загружаю локальный артефакт, на моей машине есть баночка. И просто нужно сказать Грэдлу, откуда и что положить в мой путь к классу, что еще здесь особенного?
Кселиан
40
Вы должны использовать buildScriptблок, потому что Gradle нуждается в этой информации, чтобы понять остальную часть сценария сборки . Вот почему вы должны предоставить эту информацию в отдельном канале ( buildScriptблоке). Технически говоря, Gradle нужна эта информация для компиляции и оценки остальной части сценария сборки. Под капотом происходит то, что Gradle разделяет скрипт сборки на два скрипта ( buildScriptблок и все остальное), чтобы он мог обрабатывать их отдельно.
Питер Нидервизер
1
Если вы прочитаете этот ответ после прочтения других ответов, вы сможете понять, что хочет сказать Питер (и это довольно правильно). Но вторая строка - «Без блока buildScript вы можете использовать все, что поставляется с Gradle из коробки» - это то, что делает ответ неоднозначным.
Декстер
просто быстрая заметка, которая заставила меня понять все это. когда вы используете "buildscript", вы говорите, что любые зависимости внутри buildscript {...} не используются кодом / программой Java / Kotlin (или чем бы вы ни использовали). Но вместо этого они предназначены ТОЛЬКО для использования скриптами gradle. Так, например, вам нужно использовать некоторые плагины, которые не предусмотрены по умолчанию, затем вы добавите их в buildscript {...}, и вы сможете использовать их только в скриптах gradle. надеюсь, это поможет
cesarmax
153
  • Глобальный уровень dependenciesи repositoriesразделы перечисляют зависимости, которые необходимы для сборки вашего исходного кода, его работы и т. Д.
  • Это buildscriptдля самого build.gradleфайла. Таким образом, это будет содержать зависимости, скажем, для создания RPM, Dockerfileи любые другие зависимости для запуска задач во всех зависимыхbuild.gradle
Ashish
источник
4
Все расширения самого gradle находятся через buildscript-> зависимости, которые, в свою очередь, загружаются из раздела buildscript-> repositories. Блок buildscript, запускается первым (фаза подготовки системы сборки) перед началом выполнения задачи сборки, такой как исходная компиляция и т. д.
Раджа Нагендра Кумар
4
buildscriptэто просто зависимость для вашего сценария сборки
slier
3
buildscript - это devDependencies в node.js, верхний уровень = зависимости.
Джейкоб
67

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

Обычно ввод зависимой функциональности предназначен для использования в Java-программе или любой другой программе, которую вы можете писать. Скажем, Spring, не для использования в сценарии сборки, а в Java-программе. Помещение в buildscriptзамыкание гарантирует, что зависимости доступны для использования в самой сборке Gradle. Не выходная программа.

Даниэль Герсон
источник
8

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

Маулик Барайя
источник
2

Это немного высокий уровень, но надежда помогает.

Для меня началось четкое различие, когда я начинаю понимать, что такое строительный блок , метод и задача. Как выглядит синтаксис, как вы можете их настроить и т. Д. Поэтому я предлагаю вам пройти через все это. После этого вы можете начать понимать смысл этого синтаксиса.

Затем очень важно знать тип объекта build.gradle (экземпляр класса Project), чтобы узнать, что вы можете иметь внутри файла build.gradle. Это ответило бы, откуда этот 'buildScript' и другие. И чтобы расширить ваши возможности / функции (скажем, Android), посмотрите, как плагины могут помочь.

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

стандартный вывод
источник
1

Немного больше объяснения, демонстрируя файл верхнего уровня для Android.

buildscript {
    // this is where we are going to find the libraries defined in "dependencies block" at below
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
    }

    // everything listed in the dependencies is actually a plugin, which we'll do "apply plugin" in our module level gradle file.
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2' // this is android gradle plugin
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // kotlin gradle plugin
    }
}

файл Gradle уровня модуля

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

Что такое "плагин"? Это просто Java-классы, которые реализуют интерфейс плагина. Под интерфейсом у него есть метод «применить» для добавления нескольких объектов задач с разными именами. Задача - это класс, в котором мы можем реализовать рабочий процесс. Например, задача сборки состоит из потока сборки приложения.

Итак, что делает buildscript? Он определяет, где найти плагины. Что делает плагин? Он включает в себя несколько задач. Что делает задача? Он предоставляет нам сборку, установку, сборку и т. Д.

Мое понимание может быть неправильным. Пожалуйста, не стесняйтесь поправлять меня, если вы обнаружите, что что-то вводит в заблуждение.

КунЮ Цай
источник