Cel bloku buildscript w Gradle

235

Jestem nowy w Gradle i czytam dokumentację, ale nie rozumiem niektórych jej części. Jedna z tych części jest połączona z buildscriptblokiem. Jaki jest jego cel?

Jeśli skrypt kompilacji musi korzystać z bibliotek zewnętrznych, możesz dodać je do ścieżki klas skryptu w samym skrypcie kompilacji. Robisz to za pomocą metody buildscript (), przekazując zamknięcie, które deklaruje ścieżkę klasy skryptu kompilacji.

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

Ok, ale jaka jest różnica z:

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

Na przykład, dlaczego konieczne jest użycie buildscript?

Xelian
źródło
1
możliwy duplikat zależności Gradle buildscript
fejese

Odpowiedzi:

178

W buildScriptOkreśla, blokowe, które wtyczki, zajęcia zadaniowe i inne zajęcia są dostępne do użytku w pozostałej części skryptu build . Bez buildScriptbloku możesz używać wszystkiego, co jest dostarczane z Gradle od razu po wyjęciu z pudełka. Jeśli chcesz dodatkowo używać wtyczek innych firm, klas zadań lub innych klas (w skrypcie kompilacji!), Musisz określić odpowiednie zależności w buildScriptbloku.

Peter Niederwieser
źródło
2
Nie rozumiem Em. Napisałem klasę zadania z grupą: sample.infotask', name: 'infotask', version: '1.0'I użyj zadania _uploadArchives, aby załadować ją do lokalnego repozytorium ../lib ' W innym projekcie, jeśli korzystam z mojego zadania, muszę napisać: `buildscript {repositories {maven {url' file: ../ lib '}} zależności {grupa ścieżek klasy: „sample.infotask”, nazwa: „infotask”, wersja: „1.0”}} Czy mam rację? Dlaczego musimy używać bloku buildScript ? Kiedy przesyłam artefakt lokalnie, mam słoik na moim komputerze. I po prostu muszę powiedzieć Gradle'owi, skąd i co umieścić w mojej ścieżce klasy, nic innego, co jest tutaj wyjątkowe?
Xelian
40
Musisz użyć buildScriptbloku, ponieważ Gradle potrzebuje tych informacji, aby zrozumieć resztę skryptu kompilacji . Dlatego musisz podać te informacje w osobnym kanale ( buildScriptbloku). Technicznie rzecz biorąc, Gradle potrzebuje tych informacji, aby skompilować i ocenić resztę skryptu kompilacji. To, co dzieje się pod maską, polega na tym, że Gradle dzieli skrypt kompilacji na dwa skrypty ( buildScriptblok i wszystko inne), aby mógł je przetwarzać osobno.
Peter Niederwieser
1
Jeśli przeczytasz tę odpowiedź po przeczytaniu innych odpowiedzi, możesz zrozumieć, co Piotr chce powiedzieć (i jest całkiem poprawny). Ale druga linia - „Bez bloku buildScript, możesz użyć wszystkiego, co jest dostarczane z Gradle po wyjęciu z pudełka” - jest tym, co czyni dwuznaczność ans.
Dexter,
krótka notatka, dzięki której zrozumiałem całą sprawę. używając „buildscript”, mówisz, że jakiekolwiek zależności w buildscript {...} nie są używane przez kod / program Java / Kotlin (lub cokolwiek, którego używasz). Ale zamiast tego, są przeznaczone TYLKO do użycia w skryptach stopniowych. Na przykład musisz użyć niektórych wtyczek, które nie są dostarczane domyślnie, a następnie dodać go w buildscript {...} i będziesz mógł używać go tylko w skryptach gradle. mam nadzieję, że to pomoże
cesarmax
153
  • Poziom globalny dependenciesi repositoriessekcje zawierają listę zależności wymaganych do zbudowania źródła i uruchomienia źródła itp.
  • buildscriptJest dla build.gradlesamego pliku. Tak więc zawierałoby to zależności, na przykład tworzenie RPM Dockerfile, i wszelkie inne zależności do uruchamiania zadań we wszystkich zależnychbuild.gradle
Ashish
źródło
4
Wszystkie rozszerzenia do oceniania znajdują się w zależnościach buildscript->, które z kolei są pobierane z sekcji buildscript-> repozytoria. Blok buildscript, prowadzony jest pierwszy (budowa faza przygotowania systemu) przed rozpoczęciem budowy wykonanie zadania, takie jak źródła kompilacji itp
Raja Nagendra Kumar
4
buildscriptto po prostu zależność od skryptu kompilacji
spowolniony
3
buildscript jest devDependencies w node.js, najwyższy poziom = zależności.
Jacob
67

Doceniam odpowiedź Petera ... ale od razu nie było dla mnie oczywiste, co oznacza reszta skryptu kompilacji , jak podkreślono w odpowiedzi i dokumentacji.

Zwykle wprowadzanie funkcji zależnych jest przeznaczone do użycia w programie Java lub jakimkolwiek innym programie, który piszesz. Przynosząc wiosnę powiedzmy, nie należy jej używać w skrypcie kompilacji, ale w programie Java. Umieszczenie go w buildscriptzamknięciu zapewnia dostępność zależności do użycia w samej kompilacji stopni. Nie program wyjściowy.

Daniel Gerson
źródło
8

Sekcja konfiguracji „buildscript” dotyczy samego gradla (tj. Zmian w tym, jak grad jest w stanie wykonać kompilację). Ta sekcja zazwyczaj zawiera wtyczkę Android Gradle.

Maulik Baraiya
źródło
2

To trochę wysoki poziom, ale nadzieja pomaga.

Dla mnie wyraźne rozróżnienie zaczęło się kształtować, gdy zacznę rozumieć, co jest budulcem , metodą i zadaniem. Jak wygląda składnia, jak możesz je skonfigurować itp. Sugeruję, abyś przejrzał je wszystkie. Następnie możesz zacząć rozumieć tę składnię.

Zatem bardzo ważne jest, aby wiedzieć, jaki jest typ obiektu build.gradle (instancja klasy Project), aby wiedzieć, co możesz mieć w pliku build.gradle. To by odpowiadało, skąd pochodzi ten „buildScript” i inni. Aby rozszerzyć swoje możliwości / funkcje (powiedzmy Android), zobacz, jak wtyczki mogą pomóc.

Last but not least, jest tutaj bardzo dobry samouczek , który mówi o zamknięciach, delegatach, które są pojęciami niezbędnymi do zrozumienia skryptu.

standardowe
źródło
1

Trochę więcej wyjaśnień, pokazując plik ocen najwyższego poziomu Androida.

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
    }
}

plik ocen na poziomie modułu

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

Co to jest „wtyczka”? Są to tylko klasy Java, które implementują interfejs wtyczki. Pod interfejsem ma metodę „zastosuj”, aby dodać wiele obiektów zadań o różnych nazwach. Zadanie to klasa, w której możemy zaimplementować przepływ pracy. Na przykład zadanie kompilacji składa się z procesu budowania aplikacji.

Co więc robi buildscript? Określa, gdzie znaleźć wtyczki. Do czego służy wtyczka? Obejmuje wiele zadań. Co robi zadanie? Zapewnia nam kompilację, instalację, kłaczki itp.

Moje rozumienie może być błędne. Nie wahaj się mnie poprawić, jeśli znajdziesz coś mylącego.

KunYu Tsai
źródło