web-dev-qa-db-fra.com

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

Que fait exactement Gradle transitive = true? Ce n'est pas clair d'après documentation Gradle . Ceci est dans le contexte de compile dans build.gradle. Dans mon cas, je suis dépendant de crashlytics d'Android.

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

Plusieurs documents Gradle ( ici et ici ) impliquent que "transitive" est par défaut à true. Cependant, si vous supprimez transitive = true, des dépendances transitives ne sont pas introduites (en particulier KitGroup).

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

Les docs disent que la valeur par défaut est true, mais le comportement réel semble être l'inverse.

Je lance Gradle 2.2.1. Peut-être que le comportement a changé entre 2.2 et 2.4?

Edit : Related Dépendances transitives non résolues pour la bibliothèque aar utilisant gradle

156
Steve Kuo

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

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

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

J'attendrais cela d'omettre @aar, cela devrait fonctionner sans ajouter l'attribut transitif.

128
Gabriele Mariotti

Sur une note plus générale: Si vous définissez transitive = false sur la bibliothèque crashlytics, 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 vous appuyer sur d'autres bibliothèques transitoires ajoutées par d'autres dépendances.

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

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

6
Vaiden

Mon hypothèse est que l'artefact Crashlytics auquel vous faites référence manuellement spécifie les dépendances comme pas transitif (transitive=false), de sorte que vous n'êtes pas forcé d'apporter ces dépendances par défaut. C'est pourquoi vous voyez le comportement opposé. Par exemple, certains développeurs peuvent ne pas vouloir utiliser tous les services Google Play ou quoi que ce soit d'autre que Crashlytics peut utiliser s'il est présent.

Donc, en supprimant cela, Gradle n'intervient plus dans la dépendance, et la construction échoue. 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 directement référence à l'artefact Crashlytics - vous devriez utiliser Fabric, et tirer dans Crashlytics en conséquence: https://dev.Twitter.com/fabric/Android/integrating

5
Sam Dozor

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.

1
user6703435

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.

Définir 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 requis. Si vous souhaitez uniquement un fichier jar de module, sans dépendances supplémentaires, vous pouvez également le spécifier.

1
Hongyuan

Par défaut, les dépendances Gradle sont transitive ( transitive = true ). Les dépendances transitives sont décrites plus en détail dans les référentiels Maven. Un module peut dépendre d'autres modules et Gradle peut découvrir ces dépendances de dépendances lorsqu'il résout la dépendance déclarée par rapport à un référentiel. C'est presque toujours un énorme gain de temps, mais cela peut parfois créer des problèmes.

Si vous dépendez de la version 1 du module A et de la version 2 du module B, et que le module A dépend de la version 3 du module B de manière transitoire, vous ne souhaiterez peut-être pas que Gradle résolve cette dépendance finale. Une mauvaise version d’un fichier JAR pourrait en faire un chemin de classe de compilation ou d’exécution - et la plupart des développeurs Java savent que cela peut être frustrant.

Heureusement, vous pouvez modifier la résolution de dépendance transitive en la désactivant:

transitive = false 

La source est ici

0
yoAlex5