
Entri
Artikel ini ditulis dengan tujuan proyek Android asli, tetapi karena gradle adalah sistem perakitan universal, pada prinsipnya, itu akan cocok untuk proyek-proyek lain yang dapat dikumpulkan oleh gradle. Idenya bukan milik saya, saya mendapatkannya dari proyek github dari Jake Wharton
SdkSearch - satu set program untuk mencari dokumentasi untuk android sdk.
Masalah
Aplikasi modern hampir tidak mungkin (tidak praktis) untuk menulis tanpa menggunakan perpustakaan. Dengan munculnya dependensi, tugas mengelola versi muncul. Mungkin untuk aplikasi android modul tunggal tangan tengah ini bukan masalah, maka dalam proyek yang lebih besar dengan penggunaan kembali kode, masalahnya relevan. Terutama dalam kontrol versi pustaka
dukungan androidx yang versinya hanya di luar yang wajar, Anda hanya melihat
versi AndroidXSolusi
Dengan begitu banyak dependensi, sangat penting bahwa semua modul bergantung pada satu versi perpustakaan, jika tidak, kejutan dalam runtime akan muncul di tempat yang paling tidak terduga.
Gradle menggunakan groovy sebagai bahasa scripting, yang, ditambah dengan pengetikan dinamis, menyediakan cara yang nyaman untuk mengatur manajemen ketergantungan.
Dalam lulusan DSL, Anda dapat menambahkan properti ke proyek menggunakan objek ext
ExtraPropertiesExtension . Selain itu, di dalam skrip modul, Anda dapat mengakses skrip proyek (modul root), yang memungkinkan Anda untuk mendeklarasikan semua versi dependensi dalam skrip root, dan Anda sudah dapat merujuknya dari modul apa pun di dalamnya.
Misalnya, biarkan aplikasi android kami menggunakan dependensi: kotlin, kotlin stdlib, kotlin junit, facebook sdk, androidx, materi google
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}" } }
Beberapa poin:
Jika beberapa dependensi memiliki satu versi, misalnya, bagian dari satu SDK besar, maka versi tersebut ditambahkan ke properti versi, seperti misalnya dengan versi Kotlin dan Facebook. Jika ketergantungan dalam bentuk satu baris, seperti materi google, maka tidak praktis untuk membuat versi. Versi pustaka androidx juga tidak perlu dihapus, karena Google menolak untuk menyelaraskan versi satu sama lain untuk mempercepat rilis dari masing-masing perpustakaan.
Sebagai hasil dari definisi ini, di semua modul anak, deklarasi dependensi menjadi hierarki ringkas yang bebas dari versi, karena sekarang semua modul bergantung pada versi pustaka yang sama.
contoh bagian dependensi modul di 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 }
Apa yang terjadi - versi perpustakaan dari modul-modul itu hilang, hierarki perpustakaan muncul
Perlu dicatat juga bahwa modul tidak harus bergantung pada semua perpustakaan yang dijelaskan dalam skrip root, tetapi hanya pada mereka yang diperlukan.
Seperti yang saya sebutkan di atas, draft kerja menggunakan skema seperti itu ada di
sini .