¿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.

  • onActivityResult no se llama cuando se llama a la actividad de java desde kotlin para get resultados
  • DiffUtils y multi selección
  • kartlin startactivity con banderas
  • cómo establecer el color de RecyclerView.ViewHolder en BroadcastReceiver.onReceive?
  • Okhttp3 solicita que se devuelva la respuesta vacía, así como diferentes encabezados que el cartero
  • Combina Rx Singles en Observables recursivamente
  • Cómo acceder a la variable de instancia en un object complementario estático en Koltin
  • Cómo señalar un observable para producir más datos
  • Android Espresso IntentsMatcher funciona en un dispositivo nuevo pero no antiguo
  • ¿Cuál es la diferencia de <reified T> con <reified T: Any> en Kotlin?
  • Acceso directo para "Convertir código Java (no file) a kotline"