¿Cómo / cuándo generar archivos de envoltura de Gradle?

212

Estoy tratando de entender cómo funciona el Gradle Wrapper. En muchos repositorios de origen, veo la siguiente estructura:

projectRoot/
    src/
    build.gradle
    gradle.properties
    settings.gradle
    gradlew
    gradlew.bat
    gradle/
        wrapper/
            gradle-wrapper.jar
            gradle-wrapper.properties

Mis preguntas:

  1. ¿Cómo / cuándo se genera uno? gradlew / gradlew.bat? ¿Se supone que debe generarlos solo una vez cuando se crea el proyecto por primera vez, los genera cada vez que confirma / empuja cambios? ¿Y cómo se generan?
  2. La misma pregunta anterior, pero para los gradle/wrapper/*archivos (gradle-wrapper.jar y gradle-wrapper.properties)?
  3. Algunas veces veo otras *.gradle archivos dentro del gradledirectorio del proyecto . ¿Qué son estos archivos Gradle adicionales y qué representan / hacen? Complementos personalizados?
  4. ¿Cuál es la diferencia en las propiedades que entran en settings.gradlecomparación con lo que debería definirse en el interior gradle.properties?
smeeb
fuente

Respuestas:

251
  1. Lo genera una vez, y nuevamente cuando desea cambiar la versión de Gradle que usa en el proyecto. No hay necesidad de generar es tan a menudo. Aquí están los documentos. Simplemente agregue wrappertarea abuild.gradle archivo y ejecute esta tarea para obtener la estructura del contenedor.

    Tenga en cuenta que necesita tener instalado Gradle para generar un contenedor. ¡La gran herramienta para gestionar los artefactos del ecosistema g es SDKMAN! . Para generar una envoltura de gradle, agregue el siguiente código al build.gradlearchivo:

    task wrapper(type: Wrapper) {
       gradleVersion = '2.0' //version required
    }
    

    y correr:

    gradle wrapper
    

    tarea. Agregue los archivos resultantes a SCM (por ejemplo, git) y a partir de ahora todos los desarrolladores tendrán la misma versión de Gradle cuando usen Gradle Wrapper.

    Con Gradle 2.4 (o superior) puede configurar un contenedor sin agregar una tarea dedicada:

    gradle wrapper --gradle-version 2.3
    

    o

    gradle wrapper --gradle-distribution-url https://myEnterpriseRepository:7070/gradle/distributions/gradle-2.3-bin.zip
    

    Todos los detalles se pueden encontrar aquí.

También se 3.1 --distribution-typepuede usar la opción de Gradle . Las opciones son binarias y todas y bin . todo además contiene código fuente y documentación. todo también es mejor cuando se usa IDE, por lo que el editor funciona mejor. El inconveniente es que la compilación puede durar más (necesita descargar más datos, no tiene sentido en el servidor CI) y tomará más espacio.

  1. Estos son archivos de Gradle Wrapper. Debe generarlos una vez (para una versión en particular) y agregarlos al control de versiones. Si necesita cambiar la versión de Gradle Wrapper, cambie la versión en build.gradlever (1.) y vuelva a generar los archivos.

  2. Da un ejemplo detallado. Dicho archivo puede tener múltiples propósitos: proyecto de varios módulos, separación de responsabilidades, secuencia de comandos ligeramente modificada, etc.

  3. settings.gradlees responsable más bien de la estructura del proyecto (módulos, nombres, etc.), mientras que gradle.propertiesse usa para los detalles externos del proyecto y de Gradle (versión, argumentos de la línea de comandos -XX, propiedades, etc.)

Ópalo
fuente
Gracias @Opal (+1): para darle un ejemplo específico para el n. ° 3, consulte Netflix-Eureka . ¿Qué son estos archivos Gradle?
smeeb
Ok, ya lo veo. Por lo que veo, los desarrolladores de Netflix simplemente dividieron un gran build.gradlescript en varios más cortos y se dedicaron a un script de propósito particular. Como puede, la secuencia de comandos ubicada en el directorio gradle se aplica al build.gradlearchivo principal , vea: github.com/Netflix/eureka/blob/master/build.gradle . Donde pones dichos módulos es de tu elección. Eso es todo en general. Si está satisfecho con la respuesta, acepte la respuesta :)
Opal
1
Otra opción útil de línea de comandos es --distribution-type, por ejemplo,gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee
1
Gracias @heenenee, lo agregaré a mi respuesta.
Opal
Consejo: Android Studio tiene un Gradle en su carpeta de instalación.
TWiStErRob
29

Generando el Gradle Wrapper

Proyecto construir gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

// Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
    gradleVersion = '2.2' 
}

// Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

Luego en la línea de comando ejecutar

gradle wrapper

Si le falta gradle en su sistema, instálelo o lo anterior no funcionará. En una Mac, es mejor instalar a través de Homebrew.

brew install gradle

Después de haber ejecutado con éxito la tarea de envoltura y generada gradlew, no use su sistema gradle. Le ahorrará muchos dolores de cabeza.

./gradlew assemble

¿Qué pasa con el complemento Gradle visto anteriormente?

com.android.tools.build:gradle:1.0.1

Debe configurar la versión como la más reciente y puede consultar la página de herramientas y editar la versión en consecuencia.

Mira lo que genera Android Studio

La incorporación de Gradle y el más reciente Android Studio han cambiado drásticamente el diseño del proyecto. Si tiene un proyecto anterior, le recomiendo que cree uno limpio con el último Android Studio y vea lo que Google considera el proyecto estándar.

Android Studio tiene facilidades para importar proyectos antiguos que también pueden ayudar.

Cameron Lowell Palmer
fuente
gradleVersion = '2.2'en taskWrapperpuede utilizar cualquier versión que deseo para la generación de la envoltura, correcto? ¿No tiene que ser la última versión de gradle?
raffian
1
Supongo que puedes volver a la serie 2 de gradle. No estoy del todo seguro antes de 2.x, pero no, no es necesario que siga la última versión absoluta.
Cameron Lowell Palmer
18

A partir de Gradle 2.4, puede usar gradle wrapper --gradle-version X.Xpara configurar una versión específica del contenedor Gradle, sin agregar ninguna tarea a su build.gradlearchivo. La próxima vez que use el contenedor, descargará la distribución de Gradle adecuada para que coincida.

Craig Trader
fuente
10

Si desea descargar gradle con fuente y documentos, la url de distribución predeterminada configurada en gradle-wrapper.properites no satisfará su necesidad. Es https://services.gradle.org/distributions/gradle-2.10-bin.zip , no https://services.gradle.org/distributions/gradle-2.10-all.zip . Esta IDL completa es sugerida por IDE como Android Studio. Si desea descargar el gradle completo, puede configurar la tarea de envoltura de esta manera :

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}
Geng Jiawen
fuente
1
Con versiones más recientes de gradle (no estoy seguro exactamente cuál), en lugar de reescribir manualmente la url, probablemente sea mejor usar el comando incorporado en el mismo cierre: distributionType = Wrapper.DistributionType.ALL
Dave Birch
6

Este es el comando que se debe usar para indicarle a Gradle que actualice el contenedor de modo que tome las versiones de distribución de las bibliotecas que incluyen el código fuente:

./gradlew wrapper --gradle-version <version> --distribution-type all

Si especifica el tipo de distribución con "todos", se asegurará de que Gradle descargue los archivos fuente para que los utilice su entorno de desarrollo.

Pros :

  • Los IDE tendrán acceso inmediato al código fuente. Por ejemplo, Intellij IDEA no le pedirá que actualice sus scripts de compilación para incluir la distribución de origen (porque este comando ya lo hizo)

Contras :

  • Proceso de compilación más largo / más grande porque está descargando el código fuente. Esto es una pérdida de tiempo / espacio en un servidor de compilación o CI donde el código fuente no es necesario.

Comente o proporcione otra respuesta si conoce alguna opción de línea de comandos para decirle a Gradle que no descargue fuentes en un servidor de compilación.

Shorn
fuente
1
¿Estás seguro de que esta configuración es sobre bibliotecas? Los documentos oficiales dicen lo contrario y se refieren solo al contenedor: "El tipo de distribución de Gradle que utilizará el contenedor". docs.gradle.org/current/dsl/…
Thorsten Schöning
2
  1. Los generará una vez, pero los actualizará si necesita una nueva característica o algo de un complemento que a su vez necesita una versión de Gradle más nueva.

    La forma más fácil de actualizar: a partir de Gradle 2.2, puede descargar y extraer la distribución completa o binaria de Gradle y ejecutar:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    No es necesario definir una tarea, aunque probablemente necesite algún tipo de build.gradlearchivo.

    Esto actualizará o creará gradlewy el gradlew.batcontenedor, así como gradle/wrapper/gradle-wrapper.propertiesy gradle-wrapper.jarpara proporcionar la versión actual de gradle, empaquetado.

  2. Esos son todos parte de la envoltura.

  3. Algunos build.gradlearchivos hacen referencia a otros archivos o archivos en subdirectorios que son subproyectos o módulos. Se vuelve un poco complicado, pero si tiene un proyecto, básicamente necesita el único archivo.

  4. settings.gradlemaneja proyectos, módulos y otros tipos de nombres y configuraciones, gradle.propertiesconfigura variables reutilizables para sus archivos gradle si lo desea y siente que serían más claros de esa manera.

dlamblin
fuente
2

Como las tareas integradas de Gradle están en desuso en 4.8, intente a continuación

wrapper {
   gradleVersion = '2.0' //version required
}

y correr

gradle wrapper
redactor
fuente