De la documentación de Gradle: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html
Los scripts generados por esta tarea están destinados a comprometerse con su sistema de control de versiones. Esta tarea también genera un pequeño archivo JAR de bootstrap gradle-wrapper.jar y un archivo de propiedades que también debe confirmarse en su VCS. Los scripts delegan a este JAR.
De: ¿Qué NO debe estar bajo control de fuente?
Creo Generated files
que no debería estar en el VCS.
¿Cuándo son gradlew
y se gradle/gradle-wrapper.jar
necesitan?
¿Por qué no almacenar un gradle version
en el build.gradle
archivo?
version-control
gradle
agricultor1992
fuente
fuente
Respuestas:
Porque todo el objetivo del gradle wrapper es poder, sin haber instalado nunca gradle, y sin siquiera saber cómo funciona, dónde descargarlo, qué versión, clonar el proyecto desde el VCS, ejecutar el script gradlew contiene, y para construir el proyecto sin ningún paso adicional.
Si todo lo que tenía era un número de versión de Gradle en un archivo build.gradle, necesitaría un archivo README que explicara a todos que la versión de Gradle X debe descargarse de la URL Y e instalarse, y tendría que hacerlo cada vez que se incremente la versión.
fuente
El mismo argumento va para el JDK, ¿quieres comprometer eso también? ¿También compromete todas sus bibliotecas dependientes?
Las dependencias deben actualizarse continuamente a medida que se lanzan nuevas versiones. Para obtener seguridad y otras correcciones de errores. Y porque si llegas muy lejos, puede ser una tarea que lleva mucho tiempo volver a ponerte al día.
Si el envoltorio de gradle se incrementa para cada nueva versión, y se confirma, el repositorio crecerá mucho. El problema es obvio cuando se trabaja con VCS distribuido donde un clon descargará todas las versiones de todo.
Cree un script de compilación que descargue el contenedor y lo use para compilar. Todos no necesitan saber cómo funciona el script, deben estar de acuerdo en que el proyecto se construye ejecutándolo.
Y entonces
Para descargar la versión correcta.
Resuelto por los pasos anteriores. Descargar el gradle wrapper no es diferente de descargar otras dependencias. El script podría ser inteligente para verificar cualquier envoltura de gradle actual y solo descargarlo si hay una nueva versión.
Si el desarrollador nunca ha usado Gradle antes y tal vez no sabe que el proyecto está construido con Gradle. Entonces es más obvio ejecutar un "build.sh" en comparación con ejecutar "gradlew build".
No, no necesitarías un archivo README. Podría tener uno, pero somos desarrolladores y deberíamos automatizar lo más posible. Crear un guión es mejor.
Si los desarrolladores aceptan que el proceso correcto es:
Luego, actualizar al último gradle wrapper no es un problema. Si la versión se incrementa desde la última ejecución, el script podría descargar la nueva versión.
fuente
build.gradle
control de versiones y tiene:task wrapper(type: Wrapper) { gradleVersion = 'X.X' }
entoncesgradle wrapper
descargará el contenedor que se usó y podrá reproducir la versión anterior.gradle wrapper
después de clonar en cada compilación? Básicamente, esto hace que el envoltorio sea inútil, porque su objetivo es que no tiene que instalar Gradle localmente para construir el proyecto .Me gustaría recomendar un enfoque simple.
En el archivo README de su proyecto, documente que se requiere un paso de instalación, a saber:
Esto funciona con Gradle 2.4 o superior. Esto crea un contenedor sin requerir que se agregue una tarea dedicada a "build.gradle".
Con esta opción, ignore (no registre) estos archivos / carpetas para el control de versiones:
El beneficio clave es que no tiene que registrar un archivo descargado para controlar la fuente. Cuesta un paso adicional en la instalación. Creo que vale la pena.
fuente
gradlew
. @edio lo necesitará para descargar y usar una versión específica de gradle.¿Qué es el "proyecto"?
Tal vez hay una definición técnica de este idioma que excluye los scripts de compilación. Pero si aceptamos esta definición, ¡entonces debemos decir que su "proyecto" no es todo lo que necesita versionar!
Pero si decimos "su proyecto" es todo lo que ha hecho . Entonces podemos decir que debe incluirlo y solo en VCS.
Esto es muy teórico y quizás no práctico en el caso de nuestros trabajos de desarrollo. Entonces lo cambiamos a " su proyecto es cada archivo (o carpeta) que necesita para editarlos directamente ".
"directamente" significa "no indirectamente" e "indirectamente" significa al editar otro archivo y luego se reflejará un efecto en este archivo .
Entonces llegamos a lo mismo que OP dijo (y se dice aquí ):
Si. Porque no los has creado. Por lo tanto, no forman parte de "su proyecto" según la segunda definición.
¿Cuál es el resultado de estos archivos?
build.gradle : sí. Necesitamos editarlo. Nuestros trabajos deben ser versionados.
Nota: No hay diferencia donde lo editas. Ya sea en su entorno de editor de texto o en el entorno de GUI de Project Structure De todos modos lo haces directamente !
gradle-wrapper.properties : Sí. Necesitamos al menos determinar la versión de Gradle en este archivo.
gradle-wrapper.jar y gradlew [.bat] : ¡No los he creado o editado en ninguno de mis trabajos de desarrollo, hasta este momento! Por tanto, la respuesta es no". Si lo ha hecho, la respuesta es "Sí" sobre usted en ese trabajo (y sobre el mismo archivo que editó).
La nota importante sobre el último caso es el usuario que clona su repositorio, necesita ejecutar este comando en los repositorios
<root-directory>
para generar automáticamente archivos de envoltura:$v
y$distType
se determinan a partir de gradle-wrapper.properties :Consulte https://gradle.org/install/ para obtener más información.
gradle
El ejecutable estábin/gradle[.bat]
en distribución local. No se requiere que la distribución local sea la misma que la determinada en el repositorio. Después de crear los archivos de contenedor ,gradlew[.bat]
puede descargar automáticamente la distribución de Gradle determinada (si no existe localmente). Entonces, él / ella probablemente debe regenerar los archivos de envoltura usando un nuevogradle
ejecutable (en la distribución descargada) usando las instrucciones anteriores.Nota: En las instrucciones anteriores, se supone que el usuario tiene al menos una distribución de Gradle localmente (por ejemplo
~/.gradle/wrapper/dists/gradle-4.10-bin/bg6py687nqv2mbe6e1hdtk57h/gradle-4.10
). Cubre casi todos los casos reales. Pero, ¿qué sucede si el usuario no tiene ninguna distribución ya?Él / Ella puede descargarlo manualmente usando la URL en el
.properties
archivo. Pero si él / ella no se localice en el camino que el envoltorio se esperaba, el envoltorio se descargará de nuevo! La ruta esperada es completamente predecible pero está fuera del tema (ver aquí la parte más compleja).También hay algunas formas más fáciles (pero sucias). Por ejemplo, él / ella puede copiar archivos de contenedor (excepto el
.properties
archivo) desde cualquier otro repositorio local / remoto a su repositorio y luego ejecutarlogradlew
en su repositorio. Descargará automáticamente la distribución adecuada.fuente
Según los documentos de Gradle ,
gradle-wrapper.jar
se espera que agregar a VCS ya que Gradle Wrapper esté disponible para los desarrolladores es parte del enfoque de Gradle:fuente
Vieja pregunta, nueva respuesta. Si no actualiza Gradle a menudo (la mayoría de nosotros no), es mejor comprometerlo a VCS. Y la razón principal para mí es aumentar la velocidad de compilación en el servidor CI. Hoy en día, la mayoría de los proyectos están siendo construidos e instalados por servidores CI, instancias de servidores diferentes cada vez.
Si no lo confirma, el servidor CI descargará un jar para cada compilación y aumentará significativamente el tiempo de compilación. Hay otras formas de manejar este problema, pero creo que esta es la más fácil de mantener.
fuente