it-swarm.com.de

Was genau macht transitive = true in Gradle (mit Crashlytics)?

Was bedeutet Gradle transitive = true genau machen? Aus der Gradle-Dokumentation geht nichts hervor . Dies ist im Kontext von compile innerhalb von build.gradle. In meinem Fall bin ich auf die Crashlytics von Android angewiesen.

compile('com.crashlytics.sdk.Android:crashlytics:[email protected]') {
    transitive = true;
}

Mehrere Gradle-Dokumente ( hier und hier ) implizieren, dass "transitiv" standardmäßig auf "wahr" gesetzt ist. Entfernen von transitive = true führt dazu, dass transitive Abhängigkeiten nicht berücksichtigt werden (insbesondere KitGroup).

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

Die Dokumentation sagt, dass der Standardwert true ist, das tatsächliche Verhalten scheint jedoch das Gegenteil zu sein.

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

Edit : Related Transitive Abhängigkeiten, die nicht mit gradle für eine Bibliothek aufgelöst wurden

156
Steve Kuo

Sie verwenden das @aar Notation.
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üf den 1.4.1.2. Artifact only notation Sektion:

Eine reine Artefaktnotation erstellt eine Modulabhängigkeit, die nur die Artefaktdatei mit der angegebenen Erweiterung herunterlädt. Bestehende Modulbeschreibungen werden ignoriert .

Verwendung der @aar notation Wenn Sie die Abhängigkeiten herunterladen möchten, sollten Sie transitive=true.

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

128

Allgemeiner gesagt: Einstellung transitive = false in der Bibliothek crashlytics bewirkt, dass gradle alle von crashlytics (= "transiente Bibliotheken") benötigten Bibliotheken ignoriert und nicht herunterlädt und verknüpft.

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

Die Standardeinstellung für gradle ist transitive = true.

Beispiele und vollständige Erklärung hier: http://www.devsbedevin.com/Android-understanding-gradle-dependencies-and-resolving-conflicts/

6
Vaiden

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

Wenn Sie das entfernen, bezieht Gradle die Abhängigkeit nicht mehr mit ein und kann sie nicht aufbauen. Sie können diese Abhängigkeit bei Bedarf manuell angeben.

Davon abgesehen - Ich denke, das größere Problem ist, dass Sie das Crashlytics-Artefakt nicht direkt referenzieren sollten - Sie sollten Fabric verwenden und ziehen in Crashlytics als Ergebnis: https://dev.Twitter.com/fabric/Android/integrating

5
Sam Dozor

Legt fest, ob diese Abhängigkeit aufgelöst werden soll, einschließlich oder ausschließlich ihrer transitiven Abhängigkeiten. Die zu dieser Abhängigkeit gehörenden Artefakte können auch von anderen Artefakten abhängig sein. Letztere werden transitive Abhängigkeiten genannt.

1
user6703435

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 auf "false" ä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 wünschen, können Sie dies auch angeben.

1
Hongyuan

Standardmäßig sind Gradle Abhängigkeiten transitive ( transitiv = wahr ). Transitive Abhängigkeiten werden ausführlicher in Maven Repositories beschrieben. Ein Modul ist möglicherweise von anderen Modulen abhängig, und Gradle kann diese Abhängigkeitsabhängigkeiten ermitteln, wenn die deklarierte Abhängigkeit von einem Repository aufgelöst wird. Das spart fast immer enorm viel Zeit, kann aber manchmal zu Problemen führen.

Wenn Sie von Version 1 von Modul A und Version 2 von Modul B abhängen und Modul A transitiv von Version 3 von Modul B abhängt, möchten Sie möglicherweise nicht, dass Gradle diese endgültige Abhängigkeit auflöst. Die falsche Version einer JAR-Datei schafft es möglicherweise in Ihren Kompilierungs- oder Laufzeitklassenpfad - und die meisten Java Entwickler wissen, was für eine frustrierende Erfahrung das sein kann.

Glücklicherweise können Sie die Auflösung transitiver Abhängigkeiten ändern, indem Sie sie deaktivieren:

transitive = false 

Die Quelle ist hier

0
yoAlex5