Scopo del blocco buildscript in Gradle


236

Sono nuovo di Gradle e sto leggendo la documentazione ma non ne capisco alcune parti. Una di queste parti è collegata con un buildscriptblocco. Qual è il suo scopo?

Se lo script di compilazione deve utilizzare librerie esterne, è possibile aggiungerli al percorso di classe dello script nello script di compilazione stesso. Puoi farlo usando il metodo buildscript (), passando una chiusura che dichiara il percorso di classe dello script build.

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

Ok ma qual è la differenza con:

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

Ad esempio, perché è necessario utilizzare buildscript?


1
possibile duplicato delle dipendenze
fejese

Risposte:


178

Il buildScriptblocco determina quali plugin, classi di attività e altre classi sono disponibili per l'uso nel resto dello script di compilazione . Senza un buildScriptblocco, puoi utilizzare tutto ciò che viene fornito con Gradle pronto all'uso. Se si desidera inoltre utilizzare plug-in di terze parti, classi di attività o altre classi (nello script di compilazione!), È necessario specificare le dipendenze corrispondenti nel buildScriptblocco.


2
Non riesco a capirli. Ho scritto una classe di attività con il gruppo: sample.infotask', name: 'infotask', version: '1.0'E usare l' attività _uploadArchives per caricarla nel repository locale ../lib ' In un altro progetto, se uso la mia attività, devo scrivere: `buildscript {repositories {maven {url' file: ../ lib '}} dipendenze {gruppo classpath:' sample.infotask ', nome:' infotask ', versione:' 1.0 '}} Ho ragione? Perché dobbiamo usare il blocco buildScript ? Quando carico artefatto locale ho il vaso sul mio computer. E devo solo dire a Gradle da dove e cosa mettere nel mio percorso di classe nient'altro qual è lo speciale qui?
Xelian,

40
È necessario utilizzare un buildScriptblocco perché Gradle necessita di queste informazioni per comprendere il resto dello script di compilazione . Ecco perché devi fornire queste informazioni in un canale separato (il buildScriptblocco). Tecnicamente parlando, Gradle ha bisogno di queste informazioni per compilare e valutare il resto dello script di compilazione. Quello che succede sotto il cofano è che Gradle separa lo script di build in due script (il buildScriptblocco e tutto il resto) in modo che possa elaborarli separatamente.
Peter Niederwieser,

1
Se leggi questo e dopo aver letto altre risposte, puoi capire cosa vuole dire Peter (ed è abbastanza corretto). Ma la seconda riga - "Senza un blocco buildScript, è possibile utilizzare tutto ciò che viene fornito con Gradle out-of-the-box" - è ciò che rende ambiguo ans.
Dexter,

solo una breve nota che mi ha fatto capire tutto. quando usi "buildscript", stai dicendo che qualunque dipendenza all'interno di buildscript {...} non viene usata dal codice / programma Java / Kotlin (o da qualunque cosa tu stia usando). Ma invece, sono SOLO intesi per essere utilizzati dagli script gradle. Quindi, ad esempio, devi usare alcuni plugin che non sono forniti di default, quindi lo aggiungi in buildscript {...} e sarai in grado di usarlo solo su script gradle. spero che sia d'aiuto
cesarmax il

153
  • Il livello globale dependenciese le repositoriessezioni elencano le dipendenze necessarie per costruire la tua fonte ed eseguire la tua fonte ecc.
  • Il buildscriptè per il build.gradlefile stesso. Quindi, questo conterrebbe dipendenze, ad esempio, per la creazione di RPM Dockerfilee qualsiasi altra dipendenza per l'esecuzione delle attività in tutti i dipendentibuild.gradle

4
Tutte le estensioni per il grading stesso si trovano attraverso buildscript-> dipendenze, che a loro volta vengono scaricate dalla sezione buildscript-> repository. buildscript block, viene eseguito per primo (fase di preparazione del sistema di build) prima di iniziare l'esecuzione dell'attività di compilazione come compilazione del sorgente, ecc.
Raja Nagendra Kumar

4
buildscriptè semplicemente dipendenza per il tuo script di build
prima del

3
buildscript è devDependencies in node.js, livello superiore = dipendenze.
Jacob,

67

Apprezzo la risposta di Peter ... ma non mi è stato subito chiaro cosa significasse il resto della sceneggiatura come enfatizzato nella risposta e nella documentazione.

Di solito, la funzionalità dipendente viene utilizzata nel programma Java o in qualsiasi altro programma si stia scrivendo. Portare in primavera dire, non deve essere utilizzato nello script di compilazione, ma nel programma Java. Mettendolo nella buildscriptchiusura si assicura che le dipendenze siano disponibili per l'uso all'interno della build gradle stessa. Non il programma di output.


8

La sezione di configurazione "buildscript" è per il gradle stesso (vale a dire modifiche al modo in cui gradle è in grado di eseguire la build). Quindi questa sezione di solito include il plug-in Android Gradle.


2

È un po 'alto livello ma la speranza aiuta.

Per me, una chiara distinzione ha iniziato a prendere forma una volta che ho iniziato a capire cos'è un blocco , metodo e compito. Come appare la sintassi, come puoi configurarli ecc. Quindi ti suggerisco di passare attraverso tutti questi. Successivamente, puoi iniziare a dare un senso a questa sintassi.

Quindi è molto importante sapere qual è il tipo di oggetto build.gradle (un'istanza della classe Project) in modo da sapere cosa si può avere all'interno di un file build.gradle. Ciò risponderebbe da dove provengono "buildScript" e altri. E per estendere le tue capacità / funzionalità (diciamo Android), vedi come i plugin possono aiutarti.

Ultimo ma non meno importante, c'è un ottimo tutorial qui che parla di chiusure, delegati che sono i concetti essenziali per comprendere la sceneggiatura.


1

Un po 'più di spiegazione dimostrando il file di livello superiore di 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 di livello a livello di modulo

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

Che cos'è il "plug-in"? Sono solo classi Java, che implementano l'interfaccia Plugin. Sotto l'interfaccia, ha un metodo "applica" per aggiungere più oggetti task con nomi diversi. Task è una classe in cui possiamo implementare il flusso di lavoro. Ad esempio, l'attività di compilazione consiste nel flusso di creazione dell'app.

Quindi, cosa fa buildscript? Definisce dove trovare i plugin. Cosa fa il plugin? Comprende più attività. Cosa fa l'attività? Ci fornisce build, installazione, lanugine, ecc.

La mia comprensione potrebbe essere sbagliata. Non esitare a correggermi se ritieni che qualcosa sia fuorviante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.