2017-10-04 38 views
15

The docs wspomina, że ​​implementation zapewnia znaczną poprawę czasu budowy w stosunku do compile/api. A co z compileOnly?Implementacja systemu Android Gradle vs CompileOnly

Mój przypadek użycia to wielomodułowy (przepraszam, nie podoba mi się terminologia wielo-projektowa Gradle), w którym mam aplikację na Androida i wiele bibliotek, od których zależy aplikacja (implementation). Niektóre biblioteki również zależą od siebie nawzajem. Czy powinienem używać implementation lub compileOnly podczas deklarowania zależności w modułach bibliotecznych? Mój moduł aplikacji będzie używać implementation, aby polegać na tych artefaktach, więc nie potrzebuję przechodzić przez moduły biblioteczne.

+0

'compileOnly' oznacza, że ​​te zależności byłyby dostępne chociaż skompilować tylko raz, a nie ** ** dostępne podczas wykonywania. Jeśli moduł nie potrzebuje tych zależności w środowisku wykonawczym, nie widzę problemów z deklarowaniem "kompilacji". – azizbekian

+0

Nie dotyczy to pytania dotyczącego wydajności. – Eliezer

Odpowiedz

6

Konfiguracja api należy stosować zależności eksportowanych z zewnętrznym modules(przechodni zależności). Odwrotnie implementation konfiguracja powinna być wykorzystywane do wewnętrznych zależności, które są do komponentu (nie przechodnia zależność).

realizacja vs compileOnly:

Nie ma podobieństwa w ich pracy, compileOnly jest

  • konfiguracja odziedziczone java-plugin
  • wymagane w czasie kompilacji
  • również nieuwzględnione w ścieżce klas środowiska wykonawczego lub wystawione na zależne projekty .

Więc compileOnly nie zastępuje implementation konfiguracji pracy np

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. 

Ponieważ sprawa jest „multi-module”, trzeba użyć konfiguracji api, aż do ostatecznej moduł lepiej używać implementation.

Poniższy wykres opisuje te konfiguracje:

enter image description here

wydajność?

myślę api wymaga więcej pamięci, ponieważ Gradle się migawka każdej klasy w tym przechodniegomodułu odwrotnie implementation jest korzystną konfigurację, ponieważ (jak wspomniano powyżej), to stosuje się do własnych implementacji wewnętrznych.

+0

Dziękuję za wyjaśnienie, ale moje pytanie brzmi: jakie zmiany, jeżeli istnieją, są tam z użyciem '' compileOnly' nad implementation'. – Eliezer

+0

@Eliezer zaktualizował odpowiedź. – Ibrahim

+0

Nadal nie całkiem tam.Gradle doc dla 'compileOnly' mówi" Zależności, których API jest wymagane w czasie kompilacji, ale których 'implementacja 'ma być zapewniona przez zużywającą się bibliotekę, środowisko aplikacji lub środowisko wykonawcze." Moje pytanie brzmi, czy istnieje jakakolwiek korzyść z deklarowania zależności mojej biblioteki jako 'compileOnly' vs' implementation', ponieważ oba będą działać (z zastrzeżeniem, że moduł konsumujący musiałby zadeklarować te zależności jako 'implementację 'if jeśli są w publiczny interfejs API). – Eliezer