/ / Qu'est-ce que «l'implémentation» dans les dépendances de Kotlin Gradle? - android, gradle, android-gradle, kotlin

Qu'est-ce que «l'implémentation» dans les dépendances de Kotlin Gradle? - android, gradle, android-gradle, kotlin

J'utilise Android Studio 3.0 Preview pour démarrer un nouveau projet Kotlin. Lorsque j'essaie d'ajouter des dépendances dans build.gradle j'ai vu implementation portée au lieu de d'habitude 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"

Il y a aussi androidTestImplementation et testImplementation portée.

Au final, j'ajoute compile pour ajouter des dépendances tierces et cela fonctionne.

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

Donc mes questions sont ..

  • Quel est implementation, androidTestImplementation, et testImplementation portée?
  • Est-ce différent de compile, testCompile, et androidTestCompile?
  • Lequel devrais-je utiliser pour mon projet Kotlin?

Éditer: Mon mauvais, cette question n'est pas spécifique à Kotlin. C'est la nouvelle Configuration du plugin Android Gradle.

Réponses:

17 pour la réponse № 1

Ce n'est pas spécifique à Kotlin, mais a à voir avec le nouveau plugin Gradle pour Android.

compile, provided et apk sont désormais obsolètes.
Utilisation implementation ou api au lieu de compile, compileOnly au lieu de provided, et runtimeOnly au lieu de apk.

La raison en est d'accélérer les builds multi-modules. Module donné A qui dépend du module B qui à son tour dépend du module C, un changement de module C déclencherait une recompilation du module A ainsi que. Si A n'utilise pas C directement, il n'est pas nécessaire A recompiler quand C changements.

le implementation la configuration garantit exactement cela: si vous spécifiez implementation project(":C") dans B, vous ne pouvez pas accéder C de A et vous évitez de créer des modules inutiles. Dans un grand projet multi-modules, cela peut gagner beaucoup de temps.

Voir Migrer vers le nouveau plugin Gradle pour plus d'informations.


1 pour la réponse № 2

Version antérieure de gradle v3.0.0-alpha1 utilisé pour utiliser compile mais il est désormais obsolète.

Pourquoi?

Dépendances apparaissant dans le compile les configurations seront transitoirement exposées àconsommateurs de la bibliothèque, et en tant que tels apparaîtront sur le chemin de classe de compilation des consommateurs. Les dépendances trouvées dans la configuration d'implémentation, d'autre part, ne seront pas exposées aux consommateurs, et donc ne fuiront pas dans le chemin de classe de compilation des consommateurs.

Prenons un exemple pour comprendre cela. Disons que j'ai créé un Library_Image_Upload qui supporte Image uploading au serveur. j'ai utilisé Library_Network lib in Library_Image_Upload qui prend en charge toutes les opérations réseau. Ma bibliothèque utilise uniquement les téléchargements d'images et fournit un moyen pratique de télécharger des images. Maintenant comme je l'ai utilisé Library_Network lib dans mon Library_Image_Upload projet, tous ceux qui utilisent cette bibliothèque auront la fonctionnalité de Image Uploading ainsi que toutes les opérations réseau que quelqu'un peut également utiliser(Important). Plus tard, j'ai pensé qu'il y avait une meilleure alternative à Library_Network comme Library_Magic_Image et je l'ai utilisé. Donc, toutes les fonctions API exposées par Library_Network sont partis et celui qui utilise ces fonctions a cassé la construction.

implementation est livré avec plusieurs avantages:

  • Les dépendances ne s'infiltrent plus dans le chemin de classe de compilation des consommateurs, vous ne dépendrez donc jamais accidentellement d'une dépendance transitive
  • Compilation plus rapide grâce à une taille de chemin de classe réduite
  • Moins de recompilations lorsque les dépendances d'implémentation changent: les consommateurs n'auraient pas besoin d'être recompilés
  • Publication plus propre: lorsqu'elles sont utilisées en conjonction avec le nouveau plugin maven-publish, les bibliothèques Java produisent des fichiers POM qui distinguent exactement entre ce qui est nécessaire pour compiler avec la bibliothèque et ce qui est requis pour utiliser la bibliothèque au moment de l'exécution (en d'autres termes, ne mélangez pas ce qui est nécessaire pour compiler la bibliothèque elle-même et ce qui est nécessaire pour compiler avec la bibliothèque).

Pour en savoir plus lire Le plugin Java Library

Je pense donc que vous avez la réponse aux trois questions.

J'espère que ça aide.