Que fait exactement transitive = true dans Gradle (wrt crashlytics)?

174

Que fait transitive = trueexactement Gradle ? Cela n'apparaît pas clairement dans la documentation de Gradle . C'est dans le contexte de l' compileintérieur build.gradle. Dans mon cas, je compte sur les crashlytics d'Android.

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

Plusieurs documents Gradle ( ici et ici ) impliquent que "transitive" par défaut est true. Pourtant, la suppression a pour transitive = trueconséquence que les dépendances transitives ne sont pas introduites (en particulier KitGroup).

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

La documentation dit que la valeur par défaut est true, mais le comportement réel semble être le contraire.

J'utilise Gradle 2.2.1. Peut-être que le comportement a changé entre 2,2 et 2,4?

Edit : les dépendances transitives associées non résolues pour la bibliothèque aar à l'aide de gradle

Steve Kuo
la source
lors de la définition des configurations ou lors de la définition des dépendances?
dnault le
Les dépendances des fichiers jar sont promues en sous-projets. Tous les projets n'ont pas besoin de définir explicitement leurs dépendances.
Konrad
Qu'est-ce qui n'est pas clair exactement dans cette documentation ?
Oleg Estekhin
3
@OlegEstekhin la documentation ne correspond pas au comportement d'exécution que je vois
Steve Kuo

Réponses:

153

Vous utilisez la @aarnotation.
Cela signifie que vous souhaitez télécharger uniquement l'artefact aar, et aucune dépendance.
Vous pouvez consulter cette partie de la documentation :
Consultez la 1.4.1.2. Artifact only notationsection:

Une notation d'artefact uniquement crée une dépendance de module qui télécharge uniquement le fichier d'artefact avec l'extension spécifiée. Les descripteurs de module existants sont ignorés .

En utilisant la @aarnotation si vous souhaitez télécharger les dépendances, vous devez ajouter transitive=true.

Je m'attendrais à ce qu'en omettant @aar, cela fonctionne sans ajouter l'attribut transitif.

Gabriele Mariotti
la source
7
J'ai confirmé que l'omission de @aar et la suppression de l'attribut transitif fonctionnent. L'intention ici est que les développeurs référencent explicitement les kits Fabric (par exemple, "compile 'com.crashlytics.sdk.android:crashlytics:2.5.5'"), et que les classes principales de io.fabric.sdk.android soient extraites via dépendance transitive. Si vous définissez transitive = false, la classe io.fabric.sdk.android.Fabric ne sera pas trouvée au moment de la compilation.
Mark McClelland
7
cette "fonctionnalité" est si mauvaise, je veux un aar avec ses dépendances. sans le @aar, il cherche un pot et se plaint
dowi
12

Sur une note plus générale: le paramétrage transitive = falsesur la crashlyticsbibliothèque fait que gradle ignore toutes les bibliothèques requises par crashlytics(= "bibliothèques transitoires") et ne les télécharge pas et ne les lie pas.

Vous devrez soit ajouter manuellement les bibliothèques requises à votre projet, soit compter sur d'autres bibliothèques temporaires ajoutées par d'autres dépendances.

La valeur par défaut pour gradle est transitive = true.

Exemples et explications complètes ici: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

Vaiden
la source
le lien ne fonctionne pas. Je crains que ce ne soit pas vrai par défaut, car dans certains cas, écrivez spécifiquement true
Morozov
Lien @Morozov corrigé. Merci pour le GOTCHA!
Vaiden le
5

Je suppose que l'artefact Crashlytics auquel vous faites référence spécifie manuellement les dépendances comme non transitive ( transitive=false) afin que vous ne soyez pas obligé de les intégrer par défaut. C'est pourquoi vous voyez le comportement opposé. Par exemple, certains développeurs peuvent ne pas vouloir intégrer tous les services Google Play ou tout ce que Crashlytics peut utiliser s'il est présent.

Ainsi, en supprimant cela, Gradle n'attire plus la dépendance et ne parvient pas à se créer. Vous pouvez spécifier cette dépendance manuellement si vous en avez besoin.

Cela étant dit - je pense que le plus gros problème est que vous ne devriez pas faire référence directement à l'artefact Crashlytics - vous devriez utiliser Fabric, et tirer Crashlytics en conséquence: https://dev.twitter.com/fabric/ android / intégration

Sam Dozor
la source
Les instructions de migration vers Fabric spécifient la référence directe à l'artefact Crashlytics, en supposant que vous utilisez ce "kit" Fabric
Mark McClelland
Il semble que l'intention soit de référencer directement les kits, et ils tirent les classes io.fabric.sdk.android via une dépendance transitive.
Mark McClelland
1

Définit si cette dépendance doit être résolue en incluant ou en excluant ses dépendances transitives. Les artefacts appartenant à cette dépendance peuvent eux-mêmes avoir des dépendances sur d'autres artefacts. Ces dernières sont appelées dépendances transitives.

user6703435
la source
1

Gradle suit les dépendances transitives par défaut. Si vous souhaitez désactiver cette option pour une bibliothèque particulière, utilisez l'indicateur transitif.

Changer la valeur de l'indicateur transitif sur false empêche le téléchargement des dépendances transitives, vous devrez donc ajouter vous-même ce qui est nécessaire. Si vous souhaitez uniquement un module jar, sans aucune dépendance supplémentaire, vous pouvez également le spécifier.

Hongyuan
la source
2
Quelle valeur cela a-t-il ajouté au-delà des conseils de la réponse hautement votée?
hrbrmstr
-19

transitivecontrôle la transitivité. Gradle est normalement par défaut transitif, sauf quand ce n'est pas le cas. Il y a un bogue avec la transitivité et les classificateurs, voir https://issues.gradle.org/browse/GRADLE-3188 .

Steve Kuo
la source
39
Je pense qu'il est juste que vous ayez signalé un bogue. Mais votre description de la propriété n'est pas utile. "transitive contrôle la transitivité. Gradle est normalement par défaut transitive, sauf quand ce n'est pas le cas." Vraiment, mec? ... Vraiment?
w3bshark
4
@ w3bshark J'ai trouvé ça drôle. "par défaut transitive, sauf quand ce n'est pas le cas" est assez précis d'après mon expérience.
Navin
4
@ w3bshark Je me fiche des votes. Je partage ce que j'ai appris avec la communauté.
Steve Kuo