/ / Was ist "Implementierung" in Kotlin Gradle Abhängigkeiten? - android, grandle, android-grandle, kotlin

Was ist "Implementierung" in Kotlin Gradle Abhängigkeiten? - android, grandle, android-grandle, kotlin

Ich verwende Android Studio 3.0 Preview, um ein neues Kotlin-Projekt zu starten. Ich versuche, Abhängigkeiten hinzuzufügen build.gradle ich sah implementation Umfang statt normal compile.

androidTestImplementation("com.android.support.test.espresso:espresso-core:2.2.2", {
exclude group: "com.android.support", module: "support-annotations"
})
implementation "com.android.support:appcompat-v7:25.3.1"
testImplementation "junit:junit:4.12"

Es gibt auch androidTestImplementation und testImplementation Umfang.

Am Ende füge ich hinzu compile Abhängigkeiten von Drittanbietern hinzufügen und es funktioniert.

compile "io.reactivex.rxjava2:rxandroid:2.0.1"

Also meine Fragen sind ..

  • Was ist implementation, androidTestImplementation, und testImplementation Umfang?
  • Ist es anders als? compile, testCompile, und androidTestCompile?
  • Welche sollte ich für mein Kotlin-Projekt verwenden?

Bearbeiten: Meine schlechte, diese Frage ist nicht Kotlin spezifisch. Es ist das Neue Android Gradle Plugin-Konfiguration.

Antworten:

17 für die Antwort № 1

Dies ist nicht spezifisch für Kotlin, sondern hat mit dem neuen Gradle Plugin für Android zu tun.

compile, provided und apk sind jetzt veraltet.
Benutzen implementation oder api Anstatt von compile, compileOnly Anstatt von provided, und runtimeOnly Anstatt von apk.

Der Grund dafür ist, Multi-Modul-Builds zu beschleunigen. Gegebenes Modul A was vom Modul abhängt B was wiederum vom Modul abhängt C, ein Wechsel im Modul C würde eine Neukompilierung des Moduls auslösen A auch. Ob A verwendet nicht C direkt, es besteht keine Notwendigkeit dafür A neu kompilieren wann C Änderungen.

Das implementation Konfiguration sorgt genau dafür: wenn Sie angeben implementation project(":C") im B, Sie können nicht zugreifen C von A und Sie vermeiden unnötige Module zu bauen. In einem großen Multi-Modul-Projekt kann dies viel Zeit sparen.

Sehen Migrieren Sie auf das neue Gradle-Plugin für mehr Informationen.


1 für die Antwort № 2

Frühere Version von gradle v3.0.0-alpha1 Verwendet zu verwenden compile aber es ist jetzt veraltet.

Warum?

Abhängigkeiten, die in der compile Konfigurationen werden transitiv ausgesetzt seinVerbraucher der Bibliothek, und als solche wird auf dem kompilierten Klassenpfad der Verbraucher erscheinen. Abhängigkeiten, die in der Implementierungskonfiguration gefunden werden, werden auf der anderen Seite nicht den Konsumenten ausgesetzt und fließen daher nicht in den Klassenpfad zum Kompilieren der Konsumenten ein.

Nehmen wir ein Beispiel, um das zu verstehen. Sagen wir, ich habe ein Library_Image_Upload das unterstützt Image uploading zum Server. ich benutzte Library_Network lib in Library_Image_Upload das unterstützt alle Netzwerkoperationen. Meine Bibliothek verwendet nur Bilduploads und bietet eine bequeme Möglichkeit, Bilder hochzuladen. Jetzt wie ich es benutzt habe Library_Network lib in meinem Library_Image_Upload Projekt, jeder, der diese Bibliothek benutzt, wird Funktionalität von haben Image Uploading zusammen mit allen Netzwerkoperationen das kann jemand auch benutzen(Wichtig). Später dachte ich, es gibt eine bessere Alternative zu Library_Network wie Library_Magic_Image und benutzte es. Also alle API-Funktionen von ausgesetzt Library_Network sind weg und Wer diese Funktionen benutzt, hat einen kaputten Build.

implementation kommt mit mehreren Vorteilen:

  • Abhängigkeiten gehen nicht mehr in den Kompilierungs-Klassenpfad von Konsumenten über, so dass Sie niemals versehentlich auf eine transitive Abhängigkeit angewiesen sind
  • Schnellere Zusammenstellung dank reduzierter Klassenpfadgröße
  • Weniger Neukompilierungen, wenn sich Implementierungsabhängigkeiten ändern: Konsumenten müssen nicht neu kompiliert werden
  • Sauberere Veröffentlichung: In Verbindung mit dem neuen maven-publish-Plugin erzeugen Java-Bibliotheken POM-Dateien, die genau zwischen dem unterscheiden, was zur Kompilierung mit der Bibliothek benötigt wird, und dem, was zur Laufzeit zur Verwendung der Bibliothek erforderlich ist (also nicht mischen, was ist) benötigt, um die Bibliothek selbst zu kompilieren und was benötigt wird, um gegen die Bibliothek zu kompilieren).

Um mehr zu erfahren lesen Das Java-Bibliotheks-Plugin

Also ich denke du hast die Antwort auf alle drei Fragen.

Ich hoffe, es hilft.