Les documents mentionnent que implementation
fournit des améliorations significatives du temps de construction par rapport à compile
/api
. Qu'en est-il de compileOnly
?
Mon cas d'utilisation est un projet multi-modules (désolé, je n'aime pas la terminologie multi-projets de Gradle), où j'ai une application Android, et plusieurs bibliothèques dont l'application dépend (implementation
). Certaines bibliothèques dépendent également les unes des autres. Dois-je utiliser implementation
ou compileOnly
lors de la déclaration des dépendances dans les modules de bibliothèque? Mon module d'application utilisera implementation
pour dépendre de ces artefacts, donc je n'ai pas besoin qu'ils soient transitifs à travers les modules de la bibliothèque.
La configuration api
doit être utilisée pour les dépendances qui sont exportées vers des modules
externes (dépendance transitive) . La configuration Vice-Versa implementation
doit être utilisée pour les dépendances internes au composant (pas de dépendance transitive) .
implémentation vs compileOnly:
Il n'y a aucune similitude dans leur travail, compileOnly
est
Ainsi, compileOnly
ne remplace pas le travail de configuration implementation
, par exemple:
implementation 'com.Android.support:appcompat-v7:25.1.0' // can't use compileOnly here
testCompile 'junit:junit:4.12'
compile "com.google.dagger:dagger:2.8" // can't use here also
annotationProcessor "com.google.dagger:dagger-compiler:2.8" // can't use here also
compileOnly 'javax.annotation:jsr250-api:1.0' // we can use compileOnly here because it's required on run time only.
Puisque votre cas est un "multi-module", vous devez utiliser la configuration api
, jusqu'à ce que vous atteigniez le module final, il est préférable d'utiliser implementation
.
Le graphique suivant décrit ces configurations:
Performance?
Je pense que api
nécessite plus de mémoire car gradle va instantaner chaque classe dans ce transitif module, vice versa implementation
est une configuration préférée car (comme mentionné ci-dessus), il est utilisé pour ses propres implémentations internes.
Dans Android Gradle plugin 3.0, le mot-clé compile
est désormais déconseillé au profit de implementation
et api
.
api
: vous fuyez l'interface de ce module via votre propre interface, ce qui signifie exactement la même chose que l'ancienne dépendance compile
implementation
: vous n'utilisez ce module qu'en interne et ne le faites pas passer par votre interface
En savoir plus sur l'api vs la mise en œuvre ici et ici
compileOnly
les dépendances fonctionnent de la même manière que provided
, vous permettant de déclarer des dépendances non transitives utilisées uniquement au moment de la compilation.
Les dépendances de compilation uniquement répondent à un certain nombre de cas d'utilisation, notamment:
Les dépendances de compilation uniquement sont distinctement différentes des dépendances de compilation normales. Ils ne sont pas inclus dans le chemin d'accès aux classes d'exécution et ils ne sont pas transitifs, ce qui signifie qu'ils ne sont pas inclus dans les projets dépendants.
en savoir plus ici