/ / O que é "implementação" nas dependências da Kotlin Gradle? - android, gradle, android-gradle, kotlin

O que é “implementação” nas dependências do Kotlin Gradle? - Android, gradle, android-gradle, kotlin

Estou usando o Android Studio 3.0 Preview para iniciar um novo projeto Kotlin. Enquanto tento adicionar dependências no build.gradle eu vi implementation escopo em vez do habitual 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"

Há também androidTestImplementation e testImplementation escopo.

No final, eu adiciono compile para adicionar dependências de terceiros e funciona.

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

Então, minhas perguntas são ..

  • O que é implementation, androidTestImplementatione testImplementation escopo?
  • É diferente de compile, testCompilee androidTestCompile?
  • Qual deles devo usar no meu projeto Kotlin?

Editar: Meu mal, esta questão não é específica de Kotlin. É o novo Configuração do Android Gradle Plugin.

Respostas:

17 para resposta № 1

Isso não é específico para o Kotlin, mas tem a ver com o novo plugin Gradle para Android.

compile, provided e apk agora estão obsoletos.
Usar implementation ou api ao invés de compile, compileOnly ao invés de providede runtimeOnly ao invés de apk.

A razão para isso é acelerar a compilação de vários módulos. Módulo dado A que depende do módulo B que por sua vez depende do módulo C, uma mudança no módulo C acionaria uma recompilação do módulo A também. E se A não usa C diretamente, não há necessidade de A recompilar quando C alterar.

o implementation A configuração garante exatamente isso: se você especificar implementation project(":C") dentro B, você não pode acessar C a partir de A e você evita construir módulos desnecessários. Em um projeto grande de vários módulos, isso pode economizar muito tempo.

Vejo Migrar para o novo plug-in Gradle Para maiores informações.


1 para resposta № 2

Versão anterior do gradle v3.0.0-alpha1 costumava usar compile mas foi preterido agora.

Por quê?

Dependências que aparecem no compile configurações serão expostas transitivamente aconsumidores da biblioteca e, como tal, aparecerão no caminho de classe de compilação dos consumidores. As dependências encontradas na configuração da implementação, por outro lado, não serão expostas aos consumidores e, portanto, não vazarão no caminho de classe de compilação dos consumidores.

Vamos dar um exemplo para entender isso. Digamos, eu criei um Library_Image_Upload que suporta Image uploading para o servidor. eu usei Library_Network lib em Library_Image_Upload que suporta todas as operações de rede. Minha biblioteca usa apenas uploads de imagens e fornece uma maneira conveniente de fazer upload de imagens. Agora como eu costumava Library_Network lib na minha Library_Image_Upload No projeto, todos os usuários dessa biblioteca terão a funcionalidade Image Uploading junto com todas as operações de rede que alguém também possa usar(Importante) Mais tarde, pensei que havia uma alternativa melhor para Library_Network Como Library_Magic_Image e usei. Portanto, todas as funções da API expostas por Library_Network se foram e quem estiver usando essas funções quebrou a compilação.

implementation vem com vários benefícios:

  • As dependências não vazam mais no caminho de classe de compilação dos consumidores, portanto você nunca dependerá acidentalmente de uma dependência transitiva
  • Compilação mais rápida graças ao tamanho reduzido do caminho de classe
  • Menos recompilações quando as dependências da implementação mudam: os consumidores não precisariam ser recompilados
  • Publicação mais limpa: quando usadas em conjunto com o novo plug-in maven-publish, as bibliotecas Java produzem arquivos POM que distinguem exatamente entre o que é necessário para compilar na biblioteca e o que é necessário para usar a biblioteca em tempo de execução (em outras palavras, não misture o que é necessário). necessário para compilar a própria biblioteca e o que é necessário para compilar na biblioteca).

Para saber mais, leia O plug-in da biblioteca Java

Então eu acho que você tem a resposta de todas as três perguntas.

Espero que ajude.