Gradle de mise en Œuvre de vs API de configuration
J'essaie de comprendre quelle est la différence entre api
et implementation
de configuration lors de la construction de mes dépendances.
Dans la documentation, il est dit que implementation
a un meilleur moment de la construction, mais,
en voyant cette commentaire à une question similaire, je suis arrivé à me demander si c'est vrai.
Depuis que je ne suis pas expert dans gradle, j'espère que quelqu'un peut vous aider. J'ai lu le la documentation déjà, mais je me demandais sur un facile-à-comprendre l'explication.
Avez-vous lu ici?
comme question de fait, je l'ai fait, mais, comme je l'ai dit, ce commentaire fait merveille sur elle. donc je suis un peu perdu maintenant
Vous n'aurez probablement passer votre dépendances de bibliothèques de
Donc, si j'utilise de la mise en œuvre au lieu de compiler les dépendances comme la v7 ou tout autre bibliothèque, il n'est pas censé fonctionner? parce qu'il travaille autant que j'ai testé (pas tant que ça)
c'est un super post! merci @albertbraun
comme question de fait, je l'ai fait, mais, comme je l'ai dit, ce commentaire fait merveille sur elle. donc je suis un peu perdu maintenant
Vous n'aurez probablement passer votre dépendances de bibliothèques de
compile
à api
. Les bibliothèques que vous utilisez en interne pourraient utiliser une partie privée des implémentations qui n'est pas exposée dans le final de la bibliothèque, de sorte qu'ils sont transparentes pour vous. Ces "interne-privé" dépendances peut être commuté à implementation
et quand Android gradle plugin compiler votre application, elle va sauter dans la compilation de ces dépendances qui en résulte dans une plus petite durée de la construction (mais ces dépendances seront disponibles au moment de l'exécution). Évidemment, vous pouvez faire la même chose si vous avez des locaux des bibliothèques de modulesDonc, si j'utilise de la mise en œuvre au lieu de compiler les dépendances comme la v7 ou tout autre bibliothèque, il n'est pas censé fonctionner? parce qu'il travaille autant que j'ai testé (pas tant que ça)
c'est un super post! merci @albertbraun
OriginalL'auteur Viper Alpha | 2017-06-07
Vous devez vous connecter pour publier un commentaire.
Gradle
compile
mot-clé a été dépréciée en faveur de laapi
etimplementation
des mots clés pour configurer les dépendances.À l'aide de
api
est l'équivalent de l'aide de l'obsolètecompile
, donc si vous remplacez tous lescompile
avecapi
tout fonctionne comme toujours.Pour comprendre la
implementation
mot-clé considérons l'exemple suivant.EXEMPLE
Supposons que vous avez une bibliothèque appelée
MyLibrary
qui utilise en interne une autre bibliothèque appeléeInternalLibrary
. Quelque chose comme ceci:Supposons que le
MyLibrary
build.gradle
utiliseapi
de configuration dansdependencies{}
comme ceci:Vous souhaitez utiliser
MyLibrary
dans votre code dans votre applicationbuild.gradle
vous ajouter cette dépendance:À l'aide de la
api
de configuration (ou obsolètecompile
), vous pouvez accéder à la fois àMyLibrary
etInternalLibrary
dans le code de votre application:De cette manière, le module
MyLibrary
est potentiellement une "fuite" de la mise en œuvre interne de quelque chose. Vous ne devriez pas (être capable de) l'utiliser car il n'est pas importés directement par vous.La
implementation
de configuration a été introduit pour éviter cela.Alors maintenant, si vous utilisez
implementation
au lieu deapi
dansMyLibrary
:Et dans votre application
build.gradle
:vous ne serez pas en mesure d'appeler
InternalLibrary.giveMeAString()
dans votre application code plus.Noter que si
MyLibrary
utiliseapi
à l'importationInternalLibrary
, votre application SERA être en mesure d'appelerInternalLibrary.giveMeAString()
sans problème, indépendant de l'utilisation deapi
ouimplementation
pour ajouterMyLibrary
à votre application.Ce genre de boxe stratégie permet à l'Android plugin Gradle de savoir que si vous modifiez quelque chose dans
InternalLibrary
pour déclencher la recompilation deMyLibrary
seulement et de ne pas déclencher la recompilation de l'ensemble de votre application parce que vous n'avez pas accès àInternalLibrary
.Quand vous avez beaucoup de imbriqués les dépendances de ce mécanisme peut accélérer la construction d'un beaucoup. (Regarder la vidéo, liée à la fin pour une pleine compréhension de ce)
CONCLUSIONS
Lorsque vous basculez vers la nouvelle Android plugin Gradle 3.X.X, vous devez remplacer tous vos
compile
avec leimplementation
mot-clé (1*). Ensuite, essayez de compiler et de tester votre application. Si tout est ok de laisser le code en l'état, si vous avez des problèmes, vous avez probablement quelque chose de mal avec vos dépendances ou vous avez utilisé quelque chose qui maintenant est privée et n'est pas plus accessible. Suggestion Android plugin Gradle ingénieur Jérôme Dochez (1)*)Si vous êtes une bibliothèque mantainer vous devez utiliser
api
pour chaque dépendance qui est nécessaire pour l'API publique de votre bibliothèque, alors que l'utilisationimplementation
pour le test des dépendances ou des dépendances qui ne doit pas être utilisé par les utilisateurs finaux.Article utile Mettant en valeur la différence entre mise en œuvre et api
RÉFÉRENCES
(C'est la même vidéo découpée en place pour un gain de temps)
Google I/O 2017 - Comment accélérer Gradle construit (VIDÉO COMPLÈTE)
Google I/O 2017 - Comment accélérer Gradle construit (NOUVEAU PLUGIN GRADLE 3.0.0 PARTIE SEULEMENT)
Google I/O 2017 - Comment accélérer Gradle construit (référence à 1*)
Android documentation
J'ai remarqué que l'api ne semble pas bien fonctionner dans la bibliothèque de modules. Si je l'utilise, je ne peux toujours pas accéder à l'dépendances de mon projet d'application. Je ne peut accéder au code dans la bibliothèque elle-même.
C'est très bien et fonctionne sur debug-construit la mais les lors de l'utilisation de ProGuard (à la libération-versions)
MyLibrary#myString()
va se planter parce que ProGuard auraInternalLibrary
supprimé. Quelle est la meilleure pratique pour android-libs pour être utilisé dans ProGuard ed apps?Je pense que la réponse n'est pas exacte, l'application peut utiliser quelle que soit la portée qu'elle veut pour le MyLibrary. Il permettra de voir ou de ne pas le InternalLibrary en fonction de si oui ou non le MyLibrary utilise l'api / mise en œuvre.
merci homme. génial explication, beaucoup mieux que celui donné dans android officielle de docs
OriginalL'auteur MatPag
J'aime penser à un
api
de la dépendance public (vu par d'autres modules), tandis queimplementation
de la dépendance privé (seulement vu par le présent module).Noter, que contrairement à
public
/private
de variables et de méthodes,api
/implementation
les dépendances ne sont pas appliquées par le runtime. Ce n'est qu'un moment de la construction, l'optimisation, qui permetGradle
de savoir quels modules il a besoin de recompiler lorsque l'une des dépendances de l'évolution de ses API.La vraie différence (AFAICT) est que le fichier pom met
api
dépendances dans les "compiler" portée (ils seront inclus en tant que dépendances dans votre bibliothèque et tout ce qui dépend de votre bibliothèque) etimplementation
dépendances dans "l'exécution" du champ d'application (ils feraient mieux d'être sur le chemin de la classe lorsque votre code est en cours d'exécution, mais ils ne sont pas nécessaires pour compiler un autre code qui utilise votre bibliothèque).C'est un détail d'implémentation du plugin, responsable de la génération du fichier POM, comment il les cartes de Gradle étendues à des Maven étendues.
Vous devez utiliser
implementation
de toute dépendance qui est nécessaire à l'exécution (et pour votre bibliothèque à la compilation), mais qui ne devrait pas être automatiquement tirée dans des projets qui utilisent votre bibliothèque. Un exemple serait de jax-rs, votre bibliothèque peut utiliser RESTeasy, mais il ne faut pas tirer de ces libs dans tout projet qui utilise votre bibliothèque, car ils veulent utiliser Jersey à la place.c'est de cette façon que vous connaissez quelqu'un à trouver son truc 😀 merci pour la simple et claire réponse
OriginalL'auteur dev.bmax
Considérer que vous avez
app
module qui utiliselib1
comme une bibliothèque etlib1
utiliselib2
comme une bibliothèque. Quelque chose comme ceci:app -> lib1 -> lib2
.Maintenant lors de l'utilisation de
api lib2
danslib1
, puisapp
pouvez voirlib2
codes lors de l'utilisation:api lib1
ouimplementation lib1
dans leapp
module.MAIS lors de l'utilisation de
implementation lib2
danslib1
, puisapp
ne pouvez pas voir lalib2
codes.OriginalL'auteur Ehsan Mashhadi