Giriş

Hedef kitle : Çoklu derleme projelerinde bağımlılık yönetimiyle karşı karşıya olan Gradle geliştiricileri.

Bizim plugini oluşturma çabamızda`site-baker`, temiz ve merkezi bir kod tabanı korumaya çalıştık. Modern Gradle ekosistemindeki en iyi uygulamalardan biri, …​ kullanmaktır.sürümler kataloğu(libs.versions.toml) bağımlılıkları yönetmek için. Ancak projeniz daha karmaşık hale geldiğinde ne oluyor, birkompozit yapmakNerede bir bağımsız derleme (eklentimiz) bir diğerine dahil edilmelidir?

Orada maceramız beklenmedik bir dönüm aldı. Plug-inimizi istiyorduk.site-baker, kendi Gradle projesi olan, ana projemizle aynı sürüm kataloğunu kullanır. Bu makale, serimizin beşinci olan, bu sorunu nasıl çözdüğümüzü anlatır.

1. Versiyon Kataloğu (libs.versions.toml) : Bir Hatırlatma

Dosya`gradle/libs.versions.toml`Gradle’in bir özelliği olup projenizin bağımlılıklarının sürüm ve koordinatlarını merkezi bir yerde tutmanızı sağlar. Genellikle dört bölüme ayrılmıştır:

  • [versions]: Sürüm numaraları için takma ad tanımlar (örnek:`kotlin = "1.9.20"`).

  • [libraries]: Tam bağımlılıklar için takma adlar tanımlar, yukarıda tanımlanan sürümleri kullanarak (örnek:`kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }`).

  • [bundles]: Birleştirir birden çok kütüphane tek bir takma adı altında (örnek:`jackson = ["jackson-core", "jackson-databind"]`).

  • [plugins]: Gradle eklentileri için alias tanımlar.

Bir kez tanımlandıktan sonra Gradle otomatik olarak tipize edilmiş erişimciler üretir, bu da sizin`build.gradle.kts`daha fazla okunabilir :

dependencies {
    // Au lieu de : implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.20")
    implementation(libs.kotlin.stdlib)
}
veri akışı sürüm kataloğu
@startuml
!theme plain
file "gradle/libs.versions.toml" as Toml
node "Gradle" as G
file "build.gradle.kts" as BuildScript

Toml --> G : "tarafından okunuyor"
G --> BuildScript : "libs` erişim oluşturucusunu oluşturur"
BuildScript -> G : "kullan `libs` bağımlılıkları bildirmek için"
@enduml

2. Sorun: Bir Bileşik Yapı ve Ayrı Dünyalar

Projemizin yapısı birbileşik oluştur. Ana proje (thymeleaf.cheroliv.com) eklenti projesini içerir (site-baker) komut aracılığıyla`includeBuild("site-baker")dosyada`settings.gradle.kts.

Kompozit yapı yapısı
@startuml
!theme plain
package "Projet Principal" {
  file "settings.gradle.kts" as MainSettings
  folder "gradle" {
    file "libs.versions.toml" as MainToml
  }
}

package "Plugin `site-baker` (Build Inclus)" {
  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

Sorun, varsayılan olarak, dahil edilmiş bir derleme birayrılmış dünya. Kendi yapılandırmasına, kendi yaşam döngüsüne sahiptir ve dosyayı görmez`libs.versions.toml`ana derlemenin. Bizim`plugin/build.gradle.kts`kullanmaya çalışıyordu`libs.plugins.kotlin.jvm`, ama nesne`libs`Doğru TOML dosyasından üretilemedi, bu da derleme hatalarına neden oldu.

3. Çözüm: Bağımlılık Çözümlemesi’ni Paylaşmak

Birkaç araştırma sonrasında, çözümün Gradle’in bu duruma özel olarak tasarlanmış bir özelliği olduğu ortaya çıktı :`dependencyResolutionManagement`.

Dosyada`settings.gradle.kts` du inklusif yapı(site-baker/settings.gradle.kts), Gradle’ye sürüm kataloğunu nerede bulabileceğini söyleyebiliriz.

İşte eklediğimiz yapı`site-baker/settings.gradle.kts`:

// 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")

Kritik bölümü analiz edelim :

versionCatalogs {
    create("libs") { // Crée un catalogue nommé 'libs'
        from(files("../gradle/libs.versions.toml")) // En utilisant ce fichier
    }
}
  • create("libs")`Bir sürüm kataloğu beyan ediyoruz ve bu katalog, 'alias' üzerinden erişilebilir olacak`libs.

  • from(files("../gradle/libs.versions.toml")): Bu sihirli. Gradle’a, bu catalogun kaynağının bu dizindeki TOML dosyası olduğunu söyleriz.gradle du ana proje(../)

Bu yapılandırma ile, derleme`site-baker`Şimdi, ana proje’nin sürüm kataloğunu kullanması gerektiğini biliyor. Nesne`libs`doğru şekilde oluşturulur, ve bağımlılıklar beklendiği gibi çözülür.

4. Sonuç: Yönetilmiş bileşenli yapıların gücü

Bu deneyim zengin dersler sağladı. Versiyon kataloğu, sürdürülebilirlik için harika bir araçtır, fakat bileşik derleme senaryolarındaki davranışı her zaman doğal olarak anlaşılmaz.

Anahtar, bir dahil edilmiş derlemenin yine de bağımsız bir derleme olduğunu unutmamaktır. Sürüm kataloğu gibi yapılandırmaları paylaşmak için, Gradle tarafından sağlanan açık mekanizmaları kullanmalısınız, örneğin blok.dependencyResolutionManagement`içinde`settings.gradle.kts.

Bu sorunu çözerek, derlememizi sadece daha temiz hâle getirmekle kalmayıp, aynı zamanda plugin ve ana proje arasındaki bağımlılıklar için tek bir gerçeklik kaynağı paylaşmasını sağlayarak projemizin tutarlılığını da güçlendirdik.

Bir sonraki makalede, bağımlılık yönetimimiz sağlam ve merkezi olduğuna göre, plugin’imizi daha karmaşık görevler ekleyerek zenginleştirmeye devam edeceğiz.

İlgili Makaleler