
Entrada
O artigo foi escrito visando projetos android nativos, mas como o gradle é um sistema de montagem universal, em princípio, ele será adequado para outros projetos que o gradle pode coletar. A idéia não é minha, eu peguei no projeto github do Jake Wharton
SdkSearch - um conjunto de programas para pesquisar na documentação o Android SDK.
O problema
Um aplicativo moderno é quase impossível (impraticável) de escrever sem usar bibliotecas. Com o advento das dependências, surge a tarefa de gerenciar o controle de versão. Talvez, para um aplicativo android de módulo único da mão intermediária, isso não seja um problema; em projetos maiores com reutilização de código, o problema é relevante. Especialmente no controle de versão das bibliotecas de
suporte do androidx, para as quais o controle de versão está simplesmente além do razoável, basta ver
as versões do AndroidXSolução
Com tantas dependências, é muito importante que todos os módulos dependam de uma versão da biblioteca; caso contrário, surpresas no tempo de execução sairão no local mais inesperado.
Gradle usa o groovy como uma linguagem de script, que, juntamente com a digitação dinâmica, oferece uma oportunidade conveniente para otimizar o gerenciamento de dependências.
Na graduação DSL, você pode adicionar propriedades ao projeto usando o
objeto ext
ExtraPropertiesExtension . Além disso, dentro do script do módulo, você pode acessar o script do projeto (módulo raiz), que permite declarar todas as versões das dependências no script raiz e já pode consultá-las a partir de qualquer módulo interno.
Por exemplo, deixe nosso aplicativo Android usar as dependências: kotlin, kotlin stdlib, kotlin junit, facebook sdk, androidx, google material
Root build.gradle:
buildscript { ext { versions = [ 'kotlin': '1.3.50', 'fb': '4.40.0' ] deps = [ 'kotlin': [ 'stdlib': [ 'jdk': "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin}" ], 'test': [ 'common': "org.jetbrains.kotlin:kotlin-test-common:${versions.kotlin}", 'annotations': "org.jetbrains.kotlin:kotlin-test-annotations-common:${versions.kotlin}", 'jdk': "org.jetbrains.kotlin:kotlin-test-junit:${versions.kotlin}" ] ], 'androidx' : [ 'annotation': "androidx.annotation:annotation:1.1.0", 'appCompat': 'androidx.appcompat:appcompat:1.1.0', 'constraintLayout': 'androidx.constraintlayout:constraintlayout:1.1.3', 'ktx': 'androidx.core:core-ktx:1.1.0', 'dynamicAnimation': 'androidx.dynamicanimation:dynamicanimation:1.0.0', 'gridLayout': 'androidx.gridlayout:gridlayout:1.0.0', 'localBroadcastManager': 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0', 'multidex': 'androidx.multidex:multidex:2.0.1', 'recyclerView': 'androidx.recyclerview:recyclerview:1.1.0-beta04' ], 'material': 'com.google.android.material:material:1.0.0', 'fb': [ 'core': "com.facebook.android:facebook-core:${versions.fb}", 'login': "com.facebook.android:facebook-login:${versions.fb}", 'share': "com.facebook.android:facebook-share:${versions.fb}" ] ] repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.6.0-alpha11' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" } }
Alguns pontos:
Se várias dependências tiverem uma versão, por exemplo, partes de um SDK grande, a versão será adicionada à propriedade version, como por exemplo nas versões do Kotlin e do Facebook. Se a dependência estiver na forma de uma única linha, como o material do google, não será prático criar uma versão. As versões das bibliotecas androidx também não precisam ser removidas, porque O Google se recusou a alinhar versões entre si para acelerar o lançamento de bibliotecas individuais.
Como resultado dessa definição, em todos os módulos filhos, a declaração de dependências se torna uma hierarquia concisa livre de controle de versão, porque agora todos os módulos dependem das mesmas versões da biblioteca.
exemplo da seção de dependências do módulo em build.gradle
dependencies { implementation deps.kotlin.stdlib.jdk implementation deps.androidx.appCompat implementation deps.androidx.browser implementation deps.androidx.cardView implementation deps.androidx.constraintLayout implementation deps.androidx.ktx implementation deps.androidx.multidex implementation deps.androidx.recyclerView implementation deps.material implementation deps.fb.core implementation deps.fb.login implementation deps.fb.share testImplementation deps.kotlin.test.jdk }
O que aconteceu - as versões da biblioteca dos módulos desapareceram, uma hierarquia de bibliotecas apareceu
Também é importante notar que o módulo não precisa depender de todas as bibliotecas descritas no script raiz, mas apenas daquelas necessárias.
Como mencionei acima, um rascunho de trabalho usando esse esquema está
aqui .