Gradle dependencias de buildscript

176

¿Cuál es la diferencia entre declarar repositorios en la buildScriptsección de la construcción de gradle o en el nivel raíz de la construcción?

Opción 1:

build.gradle :

buildScript {
    repositories {
        mavenCentral();
    }
}

o

build.gradle :

repositories {
    mavenCentral();
}
Jeff Storey
fuente

Respuestas:

165

Los repositorios en el bloque buildScript se utilizan para obtener las dependencias de sus dependencias buildScript. Estas son las dependencias que se colocan en el classpath de su compilación y que puede consultar desde su archivo de compilación. Por ejemplo, complementos adicionales que existen en Internet.

Los repositorios en el nivel raíz se utilizan para buscar las dependencias de las que depende su proyecto. Entonces, todas las dependencias que necesita para compilar su proyecto.

Hiery Nomus
fuente
19
Si necesito Maven Central tanto para mi buildscript como para mi proyecto, ¿debo declararlo dos veces?
Marcin Koziński
18
Sí, debe especificarlo dos veces, de hecho.
Hiery Nomus
Como ejemplo de esto, se puede agregar el complemento Spring propdeps al buildscript para habilitar las palabras clave "proporcionadas" y "opcionales" para las dependencias además de las palabras clave habituales "compilar" y "testCompile". Nota: El complemento de guerra ya ofrece la palabra clave "proporcionada", solo necesita accesorios para proyectos jar que se implementarán dentro de una guerra.
Powerlord
14

Quiero darte una idea clara. Por esta razón, adjunto el código de instantánea build.grade para una mejor comprensión.

dependencias de buildscript:

buildscript {
    repositories {
        maven { url("https://plugins.gradle.org/m2/") }
    }

    dependencies {
        classpath 'net.saliman:gradle-cobertura-plugin:2.3.2'
        classpath 'com.netflix.nebula:gradle-lint-plugin:latest.release'
    }
}

Nivel raíz / dependencias principales:

repositories{
    mavenLocal()
    maven { url("https://plugins.gradle.org/m2/") }
    maven { url "https://repo.spring.io/snapshot" }
}

dependencies {
        //Groovy
        compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.3.10'

        //Spock Test
        compile group: 'org.spockframework', name: 'spock-core', version: '1.0-groovy-2.3'

        //Test
        testCompile group: 'junit', name: 'junit', version: '4.10'
        testCompile group: 'org.testng', name: 'testng', version: '6.8.5'
}

Entonces, primero quiero aclarar en una sola palabra que

i) el archivo jar de dependencias de buildscript se descargará de los repositorios de buildscript. [Dependencia externa del proyecto]

ii) el archivo jar de dependencias de nivel raíz se descargará de los repositorios de nivel raíz. [Por dependencia del proyecto]

Aquí,

El bloque "buildscript" solo controla las dependencias para el proceso buildscript en sí, no para el código de la aplicación. Como varios plugins de gradle gradle-cobertura-plugin, gradle-lint-pluginse encuentran en los repositorios de buildscript. Esos complementos no serían referenciados como dependencias para el código de la aplicación.

Pero para la compilación de proyectos y la ejecución de pruebas, los archivos jar groovy all jar, junit and testng jarse encontrarán en repositorios de nivel raíz.

Y otra cosa , la maven { url("https://plugins.gradle.org/m2/") }porción se puede usar en ambos bloques. Porque se usan para diferentes dependencias.

Enlace de recursos: diferencia entre dependencias dentro del cierre buildscript y núcleo

Andante del cielo
fuente
12

El script de compilación (es decir, build.gradle) puede tener algunas dependencias para la ejecución del propio script de compilación. Debería encerrar esas dependencias dentro del bloque buildScript. El Capítulo 4 de Gradle Beyond the Basics lo describe en detalle.

usuario3240644
fuente