Was genau macht transitiv = wahr in Gradle (wrt Crashlytics)?


174

Was macht Gradle transitive = truegenau? Dies geht aus der Gradle-Dokumentation nicht hervor . Dies ist im Kontext von compileinnen build.gradle. In meinem Fall bin ich auf die Crashlytics von Android angewiesen.

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

Mehrere Gradle-Dokumente ( hier und hier ) implizieren, dass "transitiv" standardmäßig "true" ist. Das Entfernen transitive = trueführt jedoch dazu, dass (insbesondere KitGroup) keine transitiven Abhängigkeiten eingeführt werden .

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

Die Dokumente sagen, dass es standardmäßig true ist, aber das tatsächliche Verhalten scheint das Gegenteil zu sein.

Ich verwende Gradle 2.2.1. Vielleicht hat sich das Verhalten zwischen 2.2 und 2.4 geändert?

Bearbeiten : Verwandte Transitive Abhängigkeiten, die für eine Bibliothek mit Gradle nicht aufgelöst wurden


beim Definieren von Konfigurationen oder beim Definieren von Abhängigkeiten?
dnault

Abhängigkeiten von JAR-Dateien werden in Unterprojekte hochgestuft. Nicht jedes Projekt muss seine Abhängigkeiten explizit definieren.
Konrad

Was genau ist in dieser Dokumentation nicht klar ?
Oleg Estekhin

3
@OlegEstekhin die Dokumentation stimmt nicht mit dem Laufzeitverhalten überein, das ich sehe
Steve Kuo

Antworten:


153

Sie verwenden die @aarNotation.
Dies bedeutet, dass Sie nur das aar-Artefakt und keine Abhängigkeiten herunterladen möchten.
Sie können diesen Teil der Dokumentation überprüfen :
Überprüfen Sie den 1.4.1.2. Artifact only notationAbschnitt:

Eine Nur-Artefakt-Notation erstellt eine Modulabhängigkeit, die nur die Artefaktdatei mit der angegebenen Erweiterung herunterlädt. Vorhandene Modulbeschreibungen werden ignoriert .

Verwenden Sie die @aarNotation, wenn Sie die Abhängigkeiten herunterladen möchten, und fügen Sie sie hinzu transitive=true.

Ich würde erwarten, dass das Weglassen von @aar ohne Hinzufügen des transitiven Attributs funktioniert.


7
Ich habe bestätigt, dass das Weglassen von @aar und das Entfernen des transitiven Attributs funktioniert. Die Absicht hier ist, dass Entwickler explizit auf die Fabric-Kits verweisen (z. B. "compile 'com.crashlytics.sdk.android:crashlytics:2.5.5'") und dass die Kernklassen io.fabric.sdk.android über abgerufen werden transitive Abhängigkeit. Wenn Sie transitive = false setzen, wird die Klasse io.fabric.sdk.android.Fabric zur Kompilierungszeit nicht gefunden.
Mark McClelland

7
Dieses "Feature" ist so schlecht, ich möchte ein AAR mit seinen Abhängigkeiten. ohne das @aar sucht es nach jar und beschwert sich
dowi

12

Allgemeiner: Durch die Einstellung transitive = falsein der crashlyticsBibliothek ignoriert gradle alle von crashlytics(= "transienten Bibliotheken") benötigten Bibliotheken und lädt sie nicht herunter und verknüpft sie nicht.

Sie müssten entweder manuell die erforderlichen Bibliotheken zu Ihrem Projekt hinzufügen oder sich auf andere vorübergehende Bibliotheken verlassen, die durch andere Abhängigkeiten hinzugefügt wurden.

Standard für Gradle ist transitive = true.

Beispiele und vollständige Erklärungen hier: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/


Link funktioniert nicht. Ich fürchte, es ist nicht standardmäßig wahr, weil in einigen Fällen speziell wahr schreiben
Morozov

@ Morozov Link behoben. Danke für die GOTCHA!
Vaiden

5

Ich vermute, dass das Crashlytics-Artefakt, auf das Sie sich manuell beziehen, Abhängigkeiten als nicht transitiv ( transitive=false) angibt , damit Sie nicht gezwungen sind, diese Abhängigkeiten standardmäßig einzubringen. Deshalb sehen Sie das gegenteilige Verhalten. Beispielsweise möchten einige Entwickler möglicherweise nicht alle Google Play-Dienste oder was auch immer Crashlytics sonst noch verwendet, wenn vorhanden.

Wenn Sie dies entfernen, zieht Gradle die Abhängigkeit nicht mehr ein und kann nicht erstellt werden. Sie können diese Abhängigkeit bei Bedarf manuell angeben.

That being said - ich das größere Problem bei der Hand denken , ist , dass Sie nicht die Crashlytics Referenzierung Artefakt direkt werden soll - Sie sollten Stoff verwenden, und in Crashlytics als Folge ziehen: https://dev.twitter.com/fabric/ Android / Integrieren


In den Anweisungen für die Migration zu Fabric wird angegeben, dass direkt auf das Crashlytics-Artefakt verwiesen wird, vorausgesetzt, Sie verwenden dieses Fabric-
Mark McClelland

Es sieht so aus, als ob Sie beabsichtigen, die Kits direkt zu referenzieren, und sie ziehen die Klassen io.fabric.sdk.android über die transitive Abhängigkeit ein.
Mark McClelland

1

Legt fest, ob diese Abhängigkeit einschließlich oder ohne transitive Abhängigkeiten aufgelöst werden soll. Die zu dieser Abhängigkeit gehörenden Artefakte können selbst Abhängigkeiten von anderen Artefakten aufweisen. Letztere werden transitive Abhängigkeiten genannt.


1

Gradle folgt standardmäßig transitiven Abhängigkeiten. Wenn Sie dies für eine bestimmte Bibliothek deaktivieren möchten, verwenden Sie das Transitiv-Flag.

Wenn Sie den Wert des Transitiv-Flags in "Falsch" ändern, wird das Herunterladen von Transitiv-Abhängigkeiten verhindert. Sie müssen also selbst hinzufügen, was auch immer erforderlich ist. Wenn Sie nur ein Modul-Jar ohne zusätzliche Abhängigkeiten möchten, können Sie dies ebenfalls angeben.


2
Welchen Wert hat dies über den Rat in der hoch bewerteten Antwort hinaus hinzugefügt?
hrbrmstr

-19

transitivesteuert die Transitivität. Gradle ist normalerweise standardmäßig transitiv, außer wenn dies nicht der Fall ist. Es gibt einen Fehler mit Transitivität und Klassifikatoren, siehe https://issues.gradle.org/browse/GRADLE-3188 .


39
Ich finde es fair, dass Sie auf einen Fehler hingewiesen haben. Ihre Beschreibung der Immobilie ist jedoch nicht hilfreich. "Transitiv steuert die Transitivität. Gradle ist normalerweise standardmäßig Transitiv, außer wenn dies nicht der Fall ist." Wirklich, Alter? ... Wirklich?
w3bshark

4
@ w3bshark Ich fand es lustig. "Standardmäßig transitiv, außer wenn dies nicht der Fall ist" ist meiner Erfahrung nach ziemlich genau.
Navin

4
@ w3bshark Ich könnte mich weniger um die Stimmen kümmern. Ich teile der Community mit, was ich gelernt habe.
Steve Kuo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.