Artikel 5 : Petualangan libs.versions.toml yang dibagikan
Diterbitkan 27 September 2025
Pengenalan
Dalam pencarian kita untuk membuat plugin`site-baker`, kami berusaha menjaga basis kode yang bersih dan terpusat. Salah satu praktik terbaik dalam ekosistem Gradle modern adalah penggunaankatalog versi(libs.versions.toml) untuk mengelola dependensi. Namun apa yang terjadi ketika proyek Anda menjadi lebih kompleks, sepertimembangun kompositDi mana sebuah build independen (plugin kami) harus dimasukkan ke dalam satu yang lain?
Itulah tempat petualangan kita mengambil wending yang tidak terduga. Kami ingin bahwa plugin kami`site-baker`, yang merupakan proyek Gradle itu sendiri, menggunakan katalog versi yang sama dengan proyek utama kami. Artikel ini, yang merupakan kelima dari seri kami, menceritakan bagaimana kami telah mengatasi tantangan ini.
1. Daftar Versi (libs.versions.toml) : Sebuah pengingat
File`gradle/libs.versions.toml`adalah suatu fitur Gradle yang memungkinkan Anda untuk memusatkan versi dan koordinat dependensi proyek Anda. Umumnya diatur dalam empat bagian :
-
[versions]: Mendefinisikan alias untuk nomor versi (contoh:`kotlin = "1.9.20"`). -
[libraries]: Menetapkan alias untuk dependensi lengkap, menggunakan versi yang ditentukan di atas (contoh:`kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }`). -
[bundles]`Mengelompokkan beberapa perpustakaan di bawah satu alias (contoh:`jackson = ["jackson-core", "jackson-databind"]) -
[plugins]: Menetapkan alias untuk plugin Gradle.
Setelah ditentukan, Gradle secara otomatis menghasilkan aksesor bertipe, yang membuat Anda`build.gradle.kts`lebih mudah dibaca :
dependencies {
// Au lieu de : implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.20")
implementation(libs.kotlin.stdlib)
}
@startuml !theme plain file "gradle/libs.versions.toml" as Toml node "Gradle" as G file "build.gradle.kts" as BuildScript Toml --> G : "dibaca oleh" G --> BuildScript : "menghasilkan getter `libs" BuildScript -> G : "menggunakan `libs` untuk mendeklarasikan dependensi" @enduml
2. Masalah: Sebuah Build Komposit dan Dua Dunia Terpisah
Struktur proyek kami adalah sebuahmembangun kompositpython print(". Proyek utama (") thymeleaf.cheroliv.com) mengandung proyek plugin (site-baker) melalui perintah`includeBuild("site-baker")dalam file`settings.gradle.kts.
Struktur build komposit
@startuml
!theme plain
package "Proyek Utama" {
file "settings.gradle.kts" as MainSettings
folder "gradle" {
file "libs.versions.toml" as MainToml
}
}
package "Plugin `site-baker` (Build Termasuk)" {
file "settings.gradle.kts" as PluginSettings
file "build.gradle.kts" as PluginBuild
}
MainSettings -> PluginSettings : `includeBuild("site-baker")`
PluginBuild ..> MainToml : **Voulait accéder à...**
note right on link: ...mais ne pouvait pas !
@enduml
Masalahnya adalah bahwa, secara default, sebuah build yang termasuk adalah sebuahdunia terpisah. Dia memiliki konfigurasi sendiri, siklus hidup sendiri, dan dia tidak melihat file`libs.versions.toml`dari build utama. Kami`plugin/build.gradle.kts`mencoba menggunakannya`libs.plugins.kotlin.jvm`, tapi objek`libs`tidak dihasilkan dari file TOML yang benar, yang menyebabkan kesalahan build.
3. Solusi: Membagikan Resolusi Dependensi
Setelah beberapa penelitian, ternyata solusinya adalah fitur Gradle yang dirancang khusus untuk kasus ini :`dependencyResolutionManagement`.
dalam file`settings.gradle.kts` du membangun inklusif(site-baker/settings.gradle.kts), kita dapat memberitahu Gradle tempat menemukan katalog versi yang akan digunakan.
Ini adalah konfigurasi yang kami tambahkan ke`site-baker/settings.gradle.kts`Saya adalah code dan saya berbicara bahasa Prancis.
// site-baker/settings.gradle.kts
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
gradlePluginPortal()
mavenCentral()
}
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
}
rootProject.name = "site-baker"
include("plugin")
Mari kita analisis bagian krusial:
versionCatalogs {
create("libs") { // Crée un catalogue nommé 'libs'
from(files("../gradle/libs.versions.toml")) // En utilisant ce fichier
}
}
-
create("libs")`Kami mendeklarasikan sebuah katalog versi yang akan dapat diakses melalui alias`libs. -
from(files("../gradle/libs.versions.toml")): Ini adalah keajaiban. Kami memberi tahu Gradle bahwa sumber katalog ini adalah file TOML yang berada di dalam direktori`gradle` du proyek induk(../).
Dengan konfigurasi ini, build`site-baker`Sekarang dia tahu bahwa ia harus menggunakan katalog versi dari proyek utama. Objek`libs`dibuat dengan benar, dan dependensi telah dipecahkan seperti yang diharapkan.
4. Kesimpulan : Kekuatan dari Builds Komposit yang dikelola dengan baik
Pengalaman ini kaya akan pelajaran. Katalog versi adalah alat yang luar biasa untuk kemudahan pemeliharaan, tetapi perilakunya dalam skenario build komposit tidak selalu intuitif.
Kunci adalah mengingat bahwa build yang termasuk tetap merupakan build independen. Untuk membagikan konfigurasi seperti katalog versi, harus menggunakan mekanisme eksplisit yang disediakan oleh Gradle, seperti blok`dependencyResolutionManagement`di`settings.gradle.kts`.
Dengan menyelesaikan masalah ini, kami tidak hanya membuat build kami lebih bersih, tetapi kami juga memperkuat koherensi proyek kami dengan memastikan bahwa plugin dan proyek utama berbagi satu sumber kebenaran tunggal untuk dependensi mereka.
Dalam artikel berikutnya, kita akan terus memperkaya plugin kami dengan menambahkan tugas-tugas yang lebih kompleks, mengingat manajemen dependensi kami sudah kuat dan terpusat.