Tujuan blok buildscript di Gradle

236

Saya baru mengenal Gradle dan saya membaca dokumentasinya tetapi saya tidak mengerti beberapa bagian darinya. Salah satu bagian ini terhubung dengan buildscriptblok. Apa tujuannya?

Jika skrip build Anda perlu menggunakan pustaka eksternal, Anda bisa menambahkannya ke classpath skrip di skrip build itu sendiri. Anda melakukan ini menggunakan metode buildscript (), memberikan penutupan yang menyatakan classpath script build.

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

Ok tapi apa bedanya dengan:

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

Misalnya, mengapa perlu digunakan buildscript?

Xelian
sumber
1
kemungkinan duplikat dependensi buildscript Gradle
fejese

Jawaban:

178

The buildScriptblok menentukan plugin, kelas tugas, dan kelas-kelas lain yang tersedia untuk digunakan dalam sisa membangun script . Tanpa buildScriptblok, Anda dapat menggunakan semua yang dikirimkan dengan Gradle out-of-the-box. Jika Anda juga ingin menggunakan plugin pihak ketiga, kelas tugas, atau kelas lain (dalam skrip build!), Anda harus menentukan dependensi yang sesuai di dalam buildScriptblok.

Peter Niederwieser
sumber
2
Saya tidak bisa mengerti Em. Saya menulis sebuah kelas tugas dengan grup: sample.infotask', name: 'infotask', version: '1.0'Dan menggunakan tugas _uploadArchives untuk mengunggahnya ke repo lokal ../lib ' Dalam proyek lain jika saya menggunakan tugas saya, saya harus menulis: `buildscript {repositories {maven {url' file: ../ lib '}} dependensi {classpath grup:' sample.infotask ', nama:' infotask ', versi:' 1.0 '}} Apakah saya benar? Mengapa kita harus menggunakan blok buildScript ? Ketika saya mengunggah artefak lokal, saya memiliki toples di mesin saya. Dan hanya harus memberitahu Gradle dari mana dan apa yang harus dimasukkan ke jalur kelas saya tidak ada lagi yang spesial di sini?
Xelian
40
Anda harus menggunakan buildScriptblok karena Gradle memerlukan informasi ini untuk memahami sisa skrip build . Itu sebabnya Anda harus memberikan informasi ini di saluran terpisah ( buildScriptblok). Secara teknis, Gradle membutuhkan informasi ini untuk mengkompilasi dan mengevaluasi sisa skrip build. Apa yang terjadi di bawah tenda adalah bahwa Gradle memisahkan skrip build menjadi dua skrip ( buildScriptblok dan yang lainnya) sehingga dapat memprosesnya secara terpisah.
Peter Niederwieser
1
Jika Anda membaca ini setelah membaca jawaban lain, Anda dapat memahami apa yang ingin dikatakan Peter (dan cukup benar). Tetapi baris kedua - "Tanpa blok buildScript, Anda dapat menggunakan semua yang dikirimkan dengan Gradle out-of-the-box" - adalah yang membuat ans ambigu.
Dexter
hanya sebuah catatan singkat yang membuat saya mengerti semuanya. saat menggunakan "buildscript", Anda mengatakan bahwa dependensi apa pun dalam buildscript {...} tidak digunakan oleh kode / program Java / Kotlin (atau apa pun yang Anda gunakan). Namun, mereka HANYA dimaksudkan untuk digunakan oleh skrip gradle. Jadi misalnya Anda perlu menggunakan beberapa plugin yang tidak disediakan secara default, maka Anda menambahkannya dalam buildscript {...} dan Anda akan dapat menggunakannya pada skrip gradle saja. harap ini membantu
cesarmax
153
  • Tingkat global dependenciesdan repositoriesbagian daftar dependensi yang diperlukan untuk membangun sumber Anda dan menjalankan sumber Anda dll.
  • Ini buildscriptuntuk build.gradlefile itu sendiri. Jadi, ini akan berisi dependensi untuk mengatakan membuat RPM Dockerfile,, dan dependensi lain untuk menjalankan tugas di semua dependenbuild.gradle
Ashish
sumber
4
Semua ekstensi untuk ditingkatkan sendiri ditemukan melalui dependensi buildscript-, yang kemudian diunduh dari bagian repositori buildscript->. blok buildscript, dijalankan terlebih dahulu (tahap persiapan sistem bangun) sebelum memulai pelaksanaan tugas build seperti kompilasi sumber, dll.
Raja Nagendra Kumar
4
buildscripthanyalah ketergantungan untuk skrip build Anda
slier
3
buildscript adalah devDependencies di node.js, top-level = dependensi.
Yakub
67

Saya menghargai jawaban Peter ... tetapi tidak segera jelas bagi saya apa arti dari skrip build sebagaimana ditekankan dalam jawaban dan dalam dokumentasi.

Biasanya membawa fungsionalitas dependen adalah untuk digunakan dalam program Java atau program lain apa pun yang mungkin Anda tulis. Membawa di Spring mengatakan, tidak untuk digunakan dalam skrip build, tetapi dalam program Java. Menempatkannya di buildscriptpenutup memastikan bahwa dependensi tersedia untuk digunakan dalam gradle build itu sendiri. Bukan program keluaran.

Daniel Gerson
sumber
8

Bagian konfigurasi "buildscript" adalah untuk gradle itu sendiri (yaitu mengubah bagaimana gradle dapat melakukan build). Jadi bagian ini biasanya akan menyertakan plugin Android Gradle.

Maulik Baraiya
sumber
2

Levelnya agak tinggi tetapi harapan membantu.

Bagi saya, perbedaan yang jelas mulai terbentuk begitu saya mulai memahami apa itu building block , metode, dan tugas. Seperti apa sintaksisnya, bagaimana Anda dapat mengonfigurasinya, dll. Jadi saya sarankan Anda membaca semua ini. Setelah itu, Anda dapat mulai memahami sintaks ini.

Maka sangat penting untuk mengetahui apa tipe objek build.gradle (turunan dari kelas Project) sehingga untuk mengetahui apa yang dapat Anda miliki di dalam file build.gradle. Itu akan menjawab dari mana 'buildScript' dan lainnya berasal. Dan untuk memperluas kemampuan / fitur Anda (misalkan Android), lihat bagaimana plugin dapat membantu.

Last but not least, ada tutorial yang sangat bagus di sini yang berbicara tentang penutupan, delegasi yang merupakan konsep penting untuk memahami skrip.

stdout
sumber
1

Penjelasan lebih banyak dengan menunjukkan file gradle tingkat atas 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
    }
}

file tingkat tingkat modul

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

Apa itu "plugin"? Mereka hanya kelas java, yang mengimplementasikan antarmuka Plugin. Di bawah antarmuka, ia memiliki metode "berlaku" untuk menambahkan beberapa objek tugas dengan nama yang berbeda. Tugas adalah kelas tempat kita dapat mengimplementasikan alur kerja. Misalnya, tugas pembangunan terdiri dari aliran membangun aplikasi.

Jadi, apa yang dilakukan buildscript? Ini menentukan di mana menemukan plugin. Apa yang dilakukan plugin? Ini mencakup beberapa tugas. Apa yang dilakukan tugas? Ini memberi kami build, install, lint, dll.

Pemahaman saya mungkin salah. Tolong jangan ragu untuk mengoreksi saya jika Anda menemukan sesuatu yang menyesatkan.

KunYu Tsai
sumber