Призначення блоку buildscript у Gradle


235

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

Якщо ваш сценарій збірки потребує використання зовнішніх бібліотек, ви можете додати їх до класного сценарію сценарію в самому сценарії збірки. Ви робите це за допомогою методу buildscript (), проходячи в закритій частині, яка оголошує клас скрипта build script.

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?


1
можливий дублікат залежностей
fejese

Відповіді:


178

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


2
Я не можу зрозуміти Ема. Я написав клас завдань з групою: sample.infotask', name: 'infotask', version: '1.0'І використовую завдання _uploadArchives, щоб завантажити його до локальної репо ../lib ' В іншому проекті, якщо я використовую своє завдання, я повинен написати: `buildscript {repositories {maven {url' file: ../ lib '}} залежності {classpath group:' sample.infotask ', ім'я:' infotask ', версія:' 1.0 '}} Я прав? Чому ми повинні використовувати блокScriptScript ? Коли я завантажую локальний артефакт, я розміщую банку на своїй машині. І просто треба сказати Gradle, звідки і що ставити на моєму класному шляху нічого іншого, що тут особливого?
Кселіан

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

4
Всі розширення до gradle себе знаходяться через залежності buildscript->, які, в свою чергу, завантажуються з розділу сховища buildscript->. Блок buildscript, запускається спочатку (етап підготовки системи побудови) перед початком виконання завдання збирання, такого як компіляція джерела тощо.
Раджа Нагендра Кумар

4
buildscriptце просто залежність для побудови сценарію
хитріше

3
buildscript - це devDependitions в node.js, верхній рівень = залежності.
Яків

67

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

Зазвичай використання функціональних можливостей використовується для програми Java або будь-якої іншої програми, яку ви можете написати. Приведення в Spring скажіть, використовується не в сценарії збірки, а в програмі Java. Поміщення його у buildscriptзакриття гарантує, що залежності доступні для використання в самій системі gradle. Не вихідна програма.


8

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


2

Це трохи високий рівень, але надія допомагає.

Для мене чітке розмежування почало формуватися, коли я починаю розуміти, що таке будівельний блок , метод та завдання. Як виглядає синтаксис, як ви можете їх налаштувати тощо. Тому я пропоную вам пройти все це. Після цього ви можете почати мати сенс із цього синтаксису.

Тоді дуже важливо знати, який тип об’єкта build.gradle (екземпляр класу Project), щоб знати, що ви можете мати у файлі build.gradle. Це відповість, звідки походить цей "buildScript" та інші. А щоб розширити свої можливості / можливості (скажімо, android), подивіться, як плагіни можуть допомогти.

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


1

Трохи більше пояснення, демонструючи файл Gradle вищого рівня 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, які реалізують інтерфейс Plugin. У інтерфейсі є метод "застосувати" для додавання декількох об'єктів завдань з різними іменами. Завдання - це клас, в якому ми можемо реалізувати робочий процес. Наприклад, завдання збірки складається з потоку створення програми.

Отже, що робить buildscript? Він визначає, де знайти плагіни. Що робить плагін? Він охоплює кілька завдань. Що робить завдання? Він надає нам збірку, встановлення, облицювання тощо.

Моє розуміння може бути неправильним. Будь ласка, не соромтеся виправити мене, якщо ви виявите, що щось вводить в оману.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.