Objectif du bloc buildscript dans Gradle

236

Je suis nouveau à Gradle et je lis la documentation mais je n'en comprends pas certaines parties. Une de ces pièces est reliée au buildscriptbloc. Quel est son objectif?

Si votre script de génération doit utiliser des bibliothèques externes, vous pouvez les ajouter au chemin de classe du script dans le script de génération lui-même. Pour ce faire, utilisez la méthode buildscript (), en passant une fermeture qui déclare le chemin de classe du script de génération.

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

Ok mais quelle est la différence avec:

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

Par exemple, pourquoi est-il nécessaire d'utiliser buildscript?

Xelian
la source
1
doublon possible des dépendances de buildscript
fejese

Réponses:

178

Le buildScriptbloc détermine quels plugins, classes de tâches et autres classes sont disponibles pour une utilisation dans le reste du script de génération . Sans buildScriptbloc, vous pouvez utiliser tout ce qui est livré avec Gradle prêt à l'emploi. Si vous souhaitez en outre utiliser des plugins tiers, des classes de tâches ou d'autres classes (dans le script de build!), Vous devez spécifier les dépendances correspondantes dans le buildScriptbloc.

Peter Niederwieser
la source
2
Je ne peux pas comprendre Em. J'ai écrit une classe de tâches avec le groupe: sample.infotask', name: 'infotask', version: '1.0'Et utilisez la tâche _uploadArchives pour la télécharger vers le dépôt local ../lib ' Dans un autre projet si j'utilise ma tâche, je dois écrire: `buildscript {repositories {maven {url' file: ../ lib '}} dépendances {groupe classpath:' sample.infotask ', nom:' infotask ', version:' 1.0 '}} Ai-je raison? Pourquoi nous devons utiliser le bloc buildScript ? Lorsque je télécharge un artefact local, j'ai le pot sur ma machine. Et il suffit de dire à Gradle d'où et quoi mettre dans mon chemin de classe rien d'autre, quelle est la particularité ici?
Xelian
40
Vous devez utiliser un buildScriptbloc car Gradle a besoin de ces informations pour comprendre le reste du script de construction . C'est pourquoi vous devez fournir ces informations dans un canal séparé (le buildScriptbloc). Techniquement parlant, Gradle a besoin de ces informations pour compiler et évaluer le reste du script de construction. Ce qui se passe sous le capot, c'est que Gradle sépare le script de construction en deux scripts (le buildScriptbloc et tout le reste) afin qu'il puisse les traiter séparément.
Peter Niederwieser
1
Si vous lisez ceci et après avoir lu d'autres réponses, vous pouvez comprendre ce que Peter veut dire (et c'est assez correct). Mais la deuxième ligne - "Sans un bloc buildScript, vous pouvez utiliser tout ce qui est livré avec Gradle prêt à l'emploi" - est ce qui rend les ans ambigus.
Dexter le
juste une petite note qui m'a fait comprendre le tout. lorsque vous utilisez "buildscript", vous dites que les dépendances au sein de buildscript {...} ne sont pas utilisées par le code / programme Java / Kotlin (ou tout ce que vous utilisez). Mais à la place, ils sont UNIQUEMENT destinés à être utilisés par les scripts gradle. Ainsi, par exemple, vous devez utiliser des plugins qui ne sont pas fournis par défaut, puis vous les ajoutez dans buildscript {...} et vous ne pourrez l'utiliser que sur des scripts gradle. espérons que cela aide
cesarmax
153
  • Le niveau global dependencieset les repositoriessections répertorient les dépendances requises pour créer votre source et exécuter votre source, etc.
  • Le buildscriptest pour le build.gradlefichier lui-même. Ainsi, cela contiendrait des dépendances pour, par exemple, la création de RPM, Dockerfileet toute autre dépendance pour l'exécution des tâches dans toutes les dépendancesbuild.gradle
Ashish
la source
4
Toutes les extensions de gradle lui-même se trouvent dans les dépendances buildscript->, qui à leur tour sont téléchargées à partir de la section buildscript-> repositories. bloc buildscript, est exécuté en premier (phase de préparation du système de construction) avant de commencer l'exécution de la tâche de compilation telle que la compilation de la source, etc.
Raja Nagendra Kumar
4
buildscriptest simplement une dépendance pour votre script de construction
slier
3
buildscript est devDependencies dans node.js, top-level = dependencies.
Jacob
67

J'apprécie la réponse de Peter ... mais il n'était pas immédiatement évident pour moi ce que le reste du script de construction signifiait comme souligné dans la réponse et dans la documentation.

Habituellement, les fonctionnalités dépendantes doivent être utilisées dans le programme Java ou dans tout autre programme que vous pourriez écrire. Par exemple, apporter Spring ne doit pas être utilisé dans le script de construction, mais dans le programme Java. Le mettre dans la buildscriptfermeture garantit que les dépendances sont disponibles pour une utilisation dans la construction Gradle elle-même. Pas le programme de sortie.

Daniel Gerson
la source
8

La section de configuration "buildscript" concerne le gradle lui-même (c'est-à-dire les modifications apportées à la façon dont gradle est capable d'exécuter le build). Cette section inclura donc généralement le plugin Android Gradle.

Maulik Baraiya
la source
2

C'est un peu haut niveau mais l'espoir aide.

Pour moi, une distinction claire a commencé à se former une fois que je commence à comprendre ce qu'est un bloc de construction , une méthode et une tâche. À quoi ressemble la syntaxe, comment les configurer, etc. Je vous suggère donc de parcourir tout cela. Après cela, vous pouvez commencer à donner un sens à cette syntaxe.

Ensuite, il est très important de savoir quel est le type de l'objet build.gradle (une instance de la classe Project) afin de savoir ce que vous pouvez avoir dans un fichier build.gradle. Cela répondrait à l'origine de ce «buildScript» et d'autres. Et pour étendre vos capacités / fonctionnalités (disons Android), voyez comment les plugins peuvent vous aider.

Enfin et surtout, il y a un très bon tutoriel ici qui parle de fermetures, les délégués qui sont les concepts essentiels pour comprendre le script.

stdout
la source
1

Un peu plus d'explications en faisant la démonstration du fichier Gradle de haut niveau 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
    }
}

fichier de niveau de module

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

Qu'est-ce que le "plugin"? Ce ne sont que des classes java, qui implémentent l'interface Plugin. Sous l'interface, il a une méthode «appliquer» pour ajouter plusieurs objets de tâche avec des noms différents. La tâche est une classe où nous pouvons implémenter le flux de travail. Par exemple, la tâche de génération se compose du flux de création de l'application.

Alors, que fait buildscript? Il définit où trouver les plugins. Que fait le plugin? Il englobe plusieurs tâches. Que fait la tâche? Il nous fournit la construction, l'installation, les peluches, etc.

Ma compréhension pourrait être fausse. N'hésitez pas à me corriger si vous trouvez que quelque chose est trompeur.

KunYu Tsai
la source