java - the - install fabric
¿Qué hace exactamente transitive=true en Gradle(wrt crashlytics)? (7)
En una nota más general: establecer
transitive = false
en la biblioteca
crashlytics
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.com/android-understanding-gradle-dependencies-and-resolving-conflicts/
¿Qué hace exactamente Gradle
transitive = true
?
No está claro en la
documentación de Gradle
.
Esto está en el contexto de
compile
dentro de
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 (
here
y
here
) implican que el valor predeterminado "transitivo" es verdadero.
Sin embargo, eliminar
transitive = true
da como resultado que no se
KitGroup
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
Estás utilizando la notación
@aar
.
Significa que desea descargar solo el artefacto aar y no dependencias.
Puede consultar esta parte de la
documentación
:
Verifique el
1.4.1.2. Artifact only notation
Sección de
1.4.1.2. Artifact only notation
:
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ódulos existentes se ignoran .
Usando la notación
@aar
si desea descargar las dependencias, debe agregar
transitive=true
.
Esperaría que omitir @aar debería funcionar sin agregar el atributo transitivo.
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 denominan dependencias transitivas.
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.
Por defecto,
Gradle
dependencias de
Gradle
son
transitive
(
transitivas = verdaderas
).
Las dependencias transitivas se describen más en los repositorios de Maven.
Un módulo puede depender de otros módulos, y Gradle puede descubrir esas dependencias de dependencias cuando resuelve la dependencia declarada en un repositorio.
Esto casi siempre ahorra mucho tiempo, pero a veces puede crear problemas.
Si depende de la versión 1 del módulo A y la versión 2 del módulo B, y el módulo A depende transitivamente de la versión 3 del módulo B, es posible que no desee que Gradle resuelva esa dependencia final. La versión incorrecta de un archivo JAR podría aparecer en su ruta de compilación o en tiempo de ejecución, y la mayoría de los desarrolladores de Java saben lo frustrante que puede ser esa experiencia.
Afortunadamente, puede alterar la resolución de dependencia transitiva deshabilitándola:
transitive = false
La fuente esta here
Supongo que el artefacto de Crashlytics al que te refieres manualmente especifica dependencias como
no
transitivas (
transitive=false
) para que no estés obligado a incorporar esas dependencias por defecto.
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 es necesario.
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/integrating
transitive
controla 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
.