Propósito del bloque buildscript en Gradle

236

Soy nuevo en Gradle y estoy leyendo la documentación, pero no entiendo algunas partes. Una de estas partes está conectada con el buildscriptbloque. ¿Cual es su propósito?

Si su script de compilación necesita usar bibliotecas externas, puede agregarlas al classpath del script en el propio script de compilación. Para ello, utilice el método buildscript (), pasando un cierre que declara el classpath del script de compilación.

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

Ok, pero cuál es la diferencia con:

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

Por ejemplo, ¿por qué es necesario usar buildscript?

Xelian
fuente
1
posible duplicado de dependencias
fejese

Respuestas:

178

El buildScriptbloque determina qué complementos, clases de tareas y otras clases están disponibles para usar en el resto del script de compilación . Sin un buildScriptbloque, puede usar todo lo que viene con Gradle listo para usar. Si además desea usar complementos de terceros, clases de tareas u otras clases (en el script de compilación), debe especificar las dependencias correspondientes en el buildScriptbloque.

Peter Niederwieser
fuente
2
No puedo entender a Em. Escribí una clase de tarea con grupo: sample.infotask', name: 'infotask', version: '1.0'y use la tarea _uploadArchives para subirla al repositorio local ../lib ' En el otro proyecto, si uso mi tarea, debo escribir: `buildscript {repositorios {maven {archivo url': ../ lib '}} dependencias {grupo classpath:' sample.infotask ', nombre:' infotask ', versión:' 1.0 '}} ¿Estoy en lo cierto? ¿Por qué debemos usar el bloque buildScript ? Cuando subo el artefacto local, tengo el jar en mi máquina. Y solo tengo que decirle a Gradle de dónde y qué poner en mi classpath, nada más, ¿qué tiene de especial aquí?
Xelian
40
Debe usar un buildScriptbloque porque Gradle necesita esta información para comprender el resto del script de compilación . Es por eso que debe proporcionar esta información en un canal separado (el buildScriptbloque). Técnicamente hablando, Gradle necesita esta información para compilar y evaluar el resto del script de compilación. Lo que sucede debajo del capó es que Gradle separa el script de compilación en dos scripts (el buildScriptbloque y todo lo demás) para que pueda procesarlos por separado.
Peter Niederwieser
1
Si lees esta respuesta después de leer otras respuestas, puedes entender lo que Peter quiere decir (y es bastante correcto). Pero la segunda línea: "Sin un bloque buildScript, puede usar todo lo que viene con Gradle listo para usar", es lo que hace que el ans sea ambiguo.
Dexter
solo una nota rápida que me hizo entender todo el asunto. cuando usa "buildscript", está diciendo que las dependencias dentro de buildscript {...} no son utilizadas por el código / programa Java / Kotlin (o lo que sea que esté usando). Pero en cambio, SÓLO están destinados a ser utilizados por scripts gradle. Entonces, por ejemplo, necesita usar algunos complementos que no se proporcionan de manera predeterminada, luego lo agrega en buildscript {...} y podrá usarlo solo en scripts gradle. espero que ayude
cesarmax
153
  • El nivel global dependenciesy las repositoriessecciones enumeran las dependencias que se requieren para construir su fuente y ejecutar su fuente, etc.
  • El buildscriptes para el build.gradlearchivo en sí. Entonces, esto contendría dependencias para, por ejemplo, crear RPM Dockerfile, y cualquier otra dependencia para ejecutar las tareas en todos los dependientesbuild.gradle
Ashish
fuente
44
Todas las extensiones para gradle se encuentran a través de las dependencias de buildscript->, que a su vez se descargan de la sección de repositorios de buildscript->. El bloque buildscript se ejecuta primero (fase de preparación del sistema de compilación) antes de comenzar la ejecución de la tarea de compilación, como la compilación de origen, etc.
Raja Nagendra Kumar
44
buildscriptes simplemente dependencia para su script de compilación
lento
3
buildscript es devDependencies en node.js, nivel superior = dependencias.
Jacob
67

Agradezco la respuesta de Peter ... pero no fue inmediatamente obvio para mí lo que significaba el resto del script de compilación como se enfatizaba en la respuesta y en la documentación.

Por lo general, la funcionalidad dependiente se utiliza en el programa Java o en cualquier otro programa que esté escribiendo. La introducción de Spring, por ejemplo, no se debe utilizar en el script de compilación, sino en el programa Java. Ponerlo en el buildscriptcierre asegura que las dependencias estén disponibles para su uso dentro de la construcción de Gradle. No es el programa de salida.

Daniel Gerson
fuente
8

La sección de configuración "buildscript" es para gradle (es decir, cambios en la forma en que gradle puede realizar la compilación). Por lo tanto, esta sección generalmente incluirá el complemento Android Gradle.

Maulik Baraiya
fuente
2

Es un poco alto, pero la esperanza ayuda.

Para mí, la clara distinción comenzó a formarse una vez que comencé a comprender qué es un componente básico , un método y una tarea. Cómo se ve la sintaxis, cómo puede configurarlos, etc. Así que le sugiero que revise todo esto. Después de eso, puede comenzar a entender esta sintaxis.

Entonces es muy importante saber cuál es el tipo de objeto build.gradle (una instancia de la clase Project) para saber qué puede tener dentro de un archivo build.gradle. Eso respondería de dónde provienen ese 'buildScript' y otros. Y para ampliar sus capacidades / características (digamos Android), vea cómo los complementos pueden ayudar.

Por último, pero no menos importante, aquí hay un muy buen tutorial que habla sobre cierres, delegados, que son los conceptos esenciales para entender el guión.

stdout
fuente
1

Un poco más de explicación al demostrar el archivo gradle de nivel superior de 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
    }
}

archivo gradle a nivel de módulo

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

¿Qué es el "complemento"? Son solo clases de Java, que implementan la interfaz del complemento. Bajo la interfaz, tiene un método "aplicar" para agregar múltiples objetos de tarea con diferentes nombres. La tarea es una clase donde podemos implementar el flujo de trabajo. Por ejemplo, la tarea de compilación consiste en el flujo de compilación de la aplicación.

Entonces, ¿qué hace buildscript? Define dónde encontrar los complementos. ¿Qué hace el complemento? Abarca múltiples tareas. ¿Qué hace la tarea? Nos proporciona la construcción, instalación, pelusa, etc.

Mi entendimiento podría estar equivocado. No dudes en corregirme si encuentras algo que sea engañoso.

KunYu Tsai
fuente