¿Qué hace exactamente transitive = true en Gradle (wrt crashlytics)?

174

¿Qué hace transitive = trueexactamente Gradle ? No está claro en la documentación de Gradle . Esto está en el contexto de compiledentro build.gradle. En mi caso, estoy dependiendo de los crashlytics de Android.

compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
    transitive = true;
}

Varios documentos de Gradle ( aquí y aquí ) implican que el valor predeterminado "transitivo" es verdadero. Sin embargo, la eliminación transitive = trueda como resultado que no se introduzcan dependencias transitivas (en particular KitGroup).

class file for io.fabric.sdk.android.KitGroup not found

Los documentos dicen que el valor predeterminado es verdadero, pero el comportamiento real parece ser lo contrario.

Estoy ejecutando Gradle 2.2.1. ¿Quizás el comportamiento cambió entre 2.2 y 2.4?

Editar : dependencias transitivas relacionadas no resueltas para la biblioteca aar usando gradle

Steve Kuo
fuente
al definir configuraciones o al definir dependencias?
dnault
Las dependencias de los archivos jar se promueven a subproyectos. No todos los proyectos necesitan definir sus dependencias explícitamente.
Konrad
¿Qué es exactamente lo que no está claro en esta documentación ?
Oleg Estekhin
3
@OlegEstekhin la documentación no coincide con el comportamiento de tiempo de ejecución que estoy viendo
Steve Kuo

Respuestas:

153

Estás usando la @aarnotación.
Significa que desea descargar solo el artefacto aar y no dependencias.
Puede consultar esta parte de la documentación :
Consulte la 1.4.1.2. Artifact only notationsección:

Una notación de solo artefacto crea una dependencia de módulo que descarga solo el archivo de artefacto con la extensión especificada. Los descriptores de módulo existentes se ignoran .

Usando la @aarnotación si desea descargar las dependencias, debe agregar transitive=true.

Esperaría que omitir @aar debería funcionar sin agregar el atributo transitivo.

Gabriele Mariotti
fuente
77
Confirmé que omitir @aar y eliminar el atributo transitivo funciona. La intención aquí es que los desarrolladores hagan referencia explícita a los kits de Fabric (p. Ej., "Compile 'com.crashlytics.sdk.android:crashlytics:2.5.5'"), y que las clases principales io.fabric.sdk.android se introduzcan a través de dependencia transitiva. Si establece transitive = false, entonces la clase io.fabric.sdk.android.Fabric no se encontrará en tiempo de compilación.
Mark McClelland
77
esta "característica" es tan mala, quiero un aar con sus dependencias. sin el @aar busca frasco y se queja
dowi
12

En una nota más general: la configuración transitive = falseen la crashlyticsbiblioteca hace que gradle ignore todas las bibliotecas requeridas por crashlytics(= "bibliotecas transitorias") y no las descargue y vincule.

Tendría que agregar manualmente las bibliotecas requeridas a su proyecto o confiar en otras bibliotecas transitorias agregadas por otras dependencias.

El valor predeterminado para gradle es transitive = true.

Ejemplos y explicación completa aquí: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

Vaiden
fuente
El enlace no funciona. Me temo que no es cierto por defecto, porque en algunos casos escribe específicamente cierto
Morozov
@Morozov enlace fijo. Gracias por el GOTCHA!
Vaiden
5

Supongo que el artefacto Crashlytics al que te refieres manualmente especifica dependencias como no transitivas ( transitive=false) para que no estés obligado a incorporar esas dependencias de forma predeterminada. Es por eso que estás viendo el comportamiento opuesto. Por ejemplo, algunos desarrolladores pueden no querer incorporar todos los Servicios de Google Play o cualquier otra cosa que Crashlytics pueda usar si está presente.

Entonces, al eliminar eso, Gradle ya no atrae la dependencia y no se puede construir. Puede especificar esa dependencia manualmente si lo necesita.

Dicho esto , creo que el problema más importante en este momento es que no debería hacer referencia al artefacto de Crashlytics directamente, sino que debería usar Fabric y, como resultado, utilizar Crashlytics: https://dev.twitter.com/fabric/ android / integrando

Sam Dozor
fuente
Las instrucciones para migrar a Fabric especifican hacer referencia al artefacto de Crashlytics directamente, suponiendo que esté utilizando ese "kit" de Fabric
Mark McClelland
Parece que la intención es que haga referencia a los kits directamente, y que atraigan las clases io.fabric.sdk.android a través de la dependencia transitiva.
Mark McClelland
1

Establece si esta dependencia debe resolverse incluyendo o excluyendo sus dependencias transitivas. Los artefactos que pertenecen a esta dependencia podrían tener dependencias de otros artefactos. Estas últimas se llaman dependencias transitivas.

usuario6703435
fuente
1

Gradle sigue las dependencias transitivas por defecto. Si desea desactivar eso para una biblioteca en particular, use la bandera transitiva.

Cambiar el valor del indicador transitivo a falso evita la descarga de dependencias transitivas, por lo que deberá agregar lo que sea necesario. Si solo desea un módulo jar, sin dependencias adicionales, también puede especificarlo.

Hongyuan
fuente
2
¿Qué valor agregó esto más allá del consejo en la respuesta altamente votada?
hrbrmstr
-19

transitiveControla la transitividad. Gradle normalmente tiene el valor predeterminado de transitivo, excepto cuando no lo hace. Hay un error con transitividad y clasificadores, consulte https://issues.gradle.org/browse/GRADLE-3188 .

Steve Kuo
fuente
39
Creo que es justo que hayas señalado un error. Pero, su descripción de la propiedad no es útil. "el transitivo controla la transitividad. Gradle normalmente pasa a ser transitivo, excepto cuando no lo hace". ¿En serio, amigo? ... ¿En serio?
w3bshark
44
@ w3bshark Pensé que era divertido. "por defecto es transitivo, excepto cuando no lo hace" es bastante exacto en mi experiencia.
Navin
44
@ w3bshark No podría importarme menos los votos. Estoy compartiendo lo que he aprendido con la comunidad.
Steve Kuo