¿Qué es "implementación" en las dependencies de Kotlin Gradle?

Estoy usando Android Studio 3.0 Preview para comenzar un nuevo proyecto de Kotlin. Cuando trato de agregar dependencies en build.gradle , vi el scope de la implementation lugar de la compile habitual.

 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' 

También hay scope androidTestImplementation y testImplementation .

Al final, agrego compile para agregar dependencies de terceros y funciona.

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

Entonces mis preguntas son …

  • ¿Qué es implementation , androidTestImplementation y testImplementation scope?
  • ¿Es diferente de compile , testCompile y androidTestCompile ?
  • ¿Cuál debería usar para mi proyecto de Kotlin?

Editar: Mi mal, esta pregunta no es específica de Kotlin. Es la nueva configuration de Android Gradle Plugin .

Esto no es específico de Kotlin, sino que tiene que ver con el nuevo complemento de Gradle para Android.

compile , provided y apk ahora están en desuso.
Use la implementation o api lugar de compile , compile compileOnly lugar de provided , y runtimeOnly lugar de apk .

La razón para esto es acelerar las comstackciones de varios modules. Dado el module A que depende del module B que a su vez depende del module C , un cambio en el module C provocaría una recompilation del module A también. Si A no utiliza C directamente, no es necesario que A vuelva a comstackr cuando C cambie.

La configuration de implementation garantiza exactamente esto: si especifica el implementation project(':C') en B , no puede acceder a C desde A y evita crear modules innecesarios. En un gran proyecto de varios modules, esto puede ahorrar mucho time.

Consulte Migrar al nuevo complemento de Gradle para get más información.

La versión anterior de gradle v3.0.0-alpha1 solía usar compile pero ahora está en desuso.

¿Por qué?

Las dependencies que aparecen en las configuraciones de compile expondrán transitoriamente a los consumidores de la biblioteca y, como tales, aparecerán en la ruta de compilation de compilation de los consumidores. Las dependencies que se encuentran en la configuration de implementación, por otro lado, no estarán expuestas a los consumidores y, por lo tanto, no se filtrarán en el classpath de compilation de los consumidores.

Tomemos un ejemplo para entender esto. Digamos que creé una Library_Image_Upload que admite la Image uploading en el server. Utilicé Library_Network lib en Library_Image_Upload que admite todas las operaciones de networking. Mi biblioteca solo hace uso de cargas de imágenes y proporciona una forma conveniente de cargar imágenes. Ahora, como utilicé Library_Network lib en mi proyecto Library_Image_Upload , todos los que usan esta lib tendrán la funcionalidad de Image Uploading de Image Uploading junto con todas las operaciones de networking que alguien también puede usar ( Importante ). Más tarde pensé que hay una mejor alternativa a Library_Network como Library_Magic_Image y la usé. Por lo tanto, todas las funciones de API expuestas por Library_Network se han ido y quienquiera que las utilice se ha roto .

implementation viene con varios beneficios:

  • Las dependencies ya no se filtran en la ruta de compilation de classs de los consumidores, por lo que nunca dependerá accidentalmente de una dependencia transitiva.
  • Comstackción más rápida gracias al tamaño networkingucido de classpath
  • Menos recomstackciones cuando cambian las dependencies de implementación: los consumidores no necesitarían ser recomstackdos
  • Publicación más clara: cuando se utiliza junto con el nuevo complemento maven-publish, las bibliotecas Java producen files POM que distinguen exactamente entre lo que se requiere comstackr contra la biblioteca y lo que se requiere para usar la biblioteca en time de ejecución (en otras palabras, no mezcle lo que se necesita para comstackr la biblioteca y lo que se necesita para comstackr contra la biblioteca).

Para get más información, lee el plugin de la biblioteca de Java

Entonces creo que tienes la respuesta de las tres preguntas.

Espero que ayude.

  • ¿Cómo establecer el atributo de peso de forma dinámica desde el código de Kotlin?
  • Haga que el complemento Intellij Idea funcione con los files de Kotlin
  • Jackson's @JsonAppend con valor pnetworkingeterminado
  • ClassNotFoundException con sabores de productos y Kotlin
  • Método de llamada de la class Kotlin
  • Comstackción manual de JAR para Scala & Kotlin
  • Vista previa de Android Studio 3.0 Faltan importaciones cuando se refabrica el código de Kotlin
  • Kotlin / Java forma funcional e inmutable de recostackr un map en un map
  • Cambio observable a condición cumplida - RxJava2
  • Android - ViewDataBinding.inflate no infla la vista personalizada anidada
  • ¿Cómo podemos usar Dagger2 con kotlin?