/ / Co to jest "implementacja" w zależnościach Kotlin Gradle? - android, gradle, android-gradle, kotlin

Czym jest "implementacja" w zależnościach Kotlin Gradle? - android, gradle, android-gradle, kotlin

Używam Android Studio 3.0 Preview, aby rozpocząć nowy projekt Kotlin, podczas gdy próbuję dodawać zależności build.gradle widziałem implementation zakres zamiast zwykłego 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"

Jest także androidTestImplementation i testImplementation zakres.

W końcu dodaję compile dodać niezależne zależności i działa.

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

Moje pytania to ...

  • Co jest implementation, androidTestImplementation, i testImplementation zakres?
  • Czy to jest coś innego niż compile, testCompile, i androidTestCompile?
  • Którego powinienem użyć do mojego projektu Kotlin?

Edytować: Moja zła, to pytanie nie jest specyficzne dla Kotlina. To jest nowe Konfiguracja wtyczki Android Gradle.

Odpowiedzi:

17 dla odpowiedzi nr 1

To nie jest specyficzne dla Kotlin, ale ma do czynienia z nową wtyczką Gradle dla Androida.

compile, provided i apk są teraz przestarzałe.
Posługiwać się implementation lub api zamiast compile, compileOnly zamiast provided, i runtimeOnly zamiast apk.

Powodem tego jest przyspieszenie budowania wielomodułowego. Biorąc pod uwagę moduł A co zależy od modułu B co z kolei zależy od modułu C, zmiana w module C spowodowałoby rekompilację modułu A także. Jeśli A nie używa C bezpośrednio, nie ma takiej potrzeby A rekompilować, kiedy C zmiany.

The implementation Konfiguracja zapewnia dokładnie to: jeśli określisz implementation project(":C") w B, nie możesz uzyskać dostępu C od A i unikasz budowania niepotrzebnych modułów. W dużym projekcie wielomodułowym może to zaoszczędzić sporo czasu.

Widzieć Migracja do nowej wtyczki Gradle po więcej informacji.


1 dla odpowiedzi nr 2

Wcześniejsza wersja gradle v3.0.0-alpha1 używane do użycia compile ale teraz jest przestarzałe.

Czemu?

Zależności pojawiające się w compile konfiguracje będą narażone na przechodniekonsumentów biblioteki i jako takie pojawią się na ścieżce kompilacji konsumentów. Zależności występujące w konfiguracji implementacji nie będą natomiast narażone na działanie konsumentów, a zatem nie będą przeciekać do "ścieżki kompilacji" przez konsumentów.

Zróbmy przykład, aby to zrozumieć. Załóżmy, że stworzyłem Library_Image_Upload to wspiera Image uploading na serwer. użyłem Library_Network zaloguj się Library_Image_Upload który obsługuje wszystkie operacje sieciowe. Moja biblioteka korzysta tylko z przesłanych obrazów i zapewnia wygodny sposób przesyłania zdjęć. Teraz jak użyłem Library_Network lib w moim Library_Image_Upload projekt, każdy używający tej biblioteki będzie miał funkcjonalność Image Uploading wraz ze wszystkimi operacjami sieciowymi że ktoś może również użyć(Ważny). Później pomyślałem, że jest lepsza alternatywa Library_Network tak jak Library_Magic_Image i użył go. Wszystkie funkcje interfejsu API ujawnione przez Library_Network zniknęły i ktokolwiek używa tych funkcji, złamał kompilację.

implementation ma kilka zalet:

  • Zależności nie przenikają już do ścieżki klas kompilacji użytkowników, więc nigdy nie będziesz przypadkowo polegać na zależności tranzytowej
  • Szybsza kompilacja dzięki zmniejszonej wielkości ścieżki klasy
  • Mniejsze rekompilacje, gdy zmieniają się zależności implementacyjne: konsumenci nie musieliby być rekompilowani
  • Czystsze publikowanie: kiedy używane w połączeniu z nową wtyczką do publikowania maven-publish, biblioteki Java generują pliki POM, które rozróżniają dokładnie to, co jest wymagane do kompilacji z biblioteką i co jest wymagane do korzystania z biblioteki w środowisku wykonawczym (innymi słowy, nie mieszaj tego, co jest potrzebne do skompilowania samej biblioteki i tego, co jest potrzebne do kompilacji z biblioteką).

Aby dowiedzieć się więcej przeczytaj Plugin Java Library

Więc myślę, że masz odpowiedź na wszystkie trzy pytania.

Mam nadzieję, że to pomoże.