Gradle'da ortak bağımlılıkları tek bir yerde nasıl beyan ederim?


109

<dependencyManagement>Maven'de, ana POM bölümünde bir bağımlılık tanımlayabildiğiniz ve sürümü veya kapsamı veya herhangi bir şeyi belirtmeden alt modüllerden bu bağımlılığa referans verebileceğiniz çok kullanışlı bir özellik vardır .

Gradle'daki alternatifler nelerdir?

Yanıtlar:


179

Bir ana komut dosyasında ortak bağımlılıkları bildirebilirsiniz:

ext.libraries = [ // Groovy map literal
    spring_core: "org.springframework:spring-core:3.1",
    junit: "junit:junit:4.10"
]

Bir alt komut dosyasından, bağımlılık bildirimlerini şu şekilde kullanabilirsiniz:

dependencies {
    compile libraries.spring_core
    testCompile libraries.junit
}

Bağımlılık bildirimlerini gelişmiş yapılandırma seçenekleriyle paylaşmak için şunları kullanabilirsiniz DependencyHandler.create:

libraries = [
    spring_core: dependencies.create("org.springframework:spring-core:3.1") {
        exclude module: "commons-logging"
        force = true
    }
]

Aynı ad altında birden çok bağımlılık paylaşılabilir:

libraries = [
    spring: [ // Groovy list literal
        "org.springframework:spring-core:3.1", 
        "org.springframework:spring-jdbc:3.1"
    ]
]

dependencies { compile libraries.spring } daha sonra her iki bağımlılığı aynı anda ekleyecektir.

Bu şekilde paylaşamayacağınız tek bilgi parçası, bir bağımlılığın hangi konfigürasyona ( Maven açısından kapsam ) atanması gerektiğidir. Bununla birlikte, deneyimlerime göre, yine de bu konuda açık olmak daha iyidir.


3
Teşekkürler, bu benim sorumu çözdü, ancak yine de bir endişem var .. Maven'de sürümü boş bırakabiliriz ve bu bir kitaplık ise, bu kullanışlı çünkü uygulamamızda kullanabilir ve lib'in hangi sürümünü tanımlamak için bağımlılık yönetimi yapabilirsiniz. almalı. Gradle ile aynı şeyi nasıl yaparsınız?
Stanislav Bashkyrtsev

Soruyu anlamıyorum. Lütfen bir örnek verin.
Peter Niederwieser

4
Peter, ctapobep'in söylediği şey, maven'de, bağımlılık Yönetimi bölümünde bir üst (veya toplayıcı) pomda sürüm (ve kapsam) ile bağımlılıklar bildirebileceğinizdir. Sonra "beton" pomda, sürümü yeniden beyan etmeniz gerekmez; sadece yapı ve grup kimliği. Temelde maven'e "X: Y'ye ihtiyacım var, ancak ana bilgisayarın yapılandırdığı sürümü kullan" diyor.
Michael Campbell

2
Çoğaltma böyle bir durumu önlemek için, ben ayrı bir yaratma eğilimindedir dependencies.gradleBen mesela özellikleri gibi tüm benim bağımlılıkları tanımlayan komut: ext.GROOVY = 'org.codehaus.groovy:groovy-all:2.1.6'. Kök projeye build.gradledahil ediyorum allprojects { apply from: "$rootDir/dependencies.gradle" }. Daha sonra tüm bağımlılıklar, onları yaymak yerine tek bir dosyada tanımlanır ve bağımlılık yapılandırmalarında daha "okunması kolay" sabitler kullanılır.
Steinar

1
Yukarıda yaptığım tam olarak buydu. Başvuru yapmanıza gerek yoktur allprojectsçünkü proje düzeyinde ekstra özellikler alt projeler tarafından görülebilir.
Peter Niederwieser

7

Bu geç bir cevap, ancak şu adrese de göz atmak isteyebilirsiniz: http://plugins.gradle.org/plugin/io.spring.dependency-management Bir maven 'bom' içe aktarma ve tanımları yeniden kullanma imkanı sağlar 'bom' olarak tanımlanmıştır. Yavaş yavaş maven'den aşama geçişe geçerken kesinlikle güzel bir yardım! Şu anda tadını çıkarıyorum.


Birkaç (çoklu) projede aynı bağımlılıkları paylaşmak istediğinizde bile sahip olunması gereken bir şey.
roomsg

7
Uygun olmasına rağmen, bu eklentinin önemli bir performans ayak izi olabilir. 200'den fazla bağımlılığa sahip 30 alt proje için, bağımlılık çözüm aşamasına 1 dakikaya kadar ekler. Küçük projeler için bir cazibe gibi çalışıyor
Jk1

aynı zamanda geçişli bağımlılık sürümlerini de geçersiz kılar, örneğin bağımlılık yönetiminde 3.0.0 sürümünü beyan ettiniz, ancak alt projelerden biri için daha eski bir sürüm, örneğin 2.5.0 kullanmanız gerekir, bu durumda bu eski projeye bağlı bir projeniz varsa
2.5.0'dan

7

Gradle 4.6'dan itibaren, bunu başarmanın yolu olarak dokümantasyonda bağımlılık kısıtlamaları önerilmektedir. Gönderen https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_version :

Daha büyük projeler için önerilen bir uygulama, bağımlılıkları sürümler olmadan bildirmek ve sürüm bildirimi için bağımlılık kısıtlamaları kullanmaktır. Bunun avantajı, bağımlılık kısıtlamalarının geçişli olanlar da dahil olmak üzere tüm bağımlılıkların sürümlerini tek bir yerde yönetmenize izin vermesidir.

Üst build.gradledosyanızda:

allprojects {
  plugins.withType(JavaPlugin).whenPluginAdded {
    dependencies {
      constraints {
        implementation("com.google.guava:guava:27.0.1-jre")
      }
    }
  }
}

Bağımlılıklar bloğunu Java eklentisini kontrol ederek sarmak (... whenPluginAdded {) kesinlikle gerekli değildir, ancak daha sonra aynı yapıya Java dışı bir proje eklemeyi ele alacaktır.

Daha sonra bir çocuk aşamalı projesinde, basitçe versiyonu atlayabilirsiniz:

apply plugin: "java"

dependencies {
  implementation("com.google.guava:guava")
}

Alt derlemeler yine de daha yüksek bir sürüm belirtmeyi seçebilir. Daha düşük bir sürüm belirtilirse, kısıtlamadaki sürüme otomatik olarak yükseltilir.


1
Bağımlılık kısıtlamaları Gralde 4.6'da eklendi, bu nedenle bu Gradle 4.6 veya üstü ile çalışacak.
Jim Hurne

Sanırım Gradle, Java Platform Eklentisinin böyle bir durumda kullanılmasını sağlıyor. Ancak, Gradle belgeleri bu noktada çok net değil. Sanırım kullanımı allprojectsda gayet iyi.
JojOatXGME

kök projede kısıtlamaları bildirmek istiyorum, ancak yalnızca alt projelerimden birinde, tanımlanmış kısıtlamaları olan tüm bu bağımlılıkları yüklemek istiyorum.
dtc

2

io.spring.gradle:dependency-management-plugineklentinin yeni Gradle 3.x serileriyle sorunları var ancak 2.x serisi için kararlı. Referans için Gradle 3 # 115 için hata raporu bırakma desteğine bakın

Bahar durumunda ( ürün reçetesi kullanımının ana destekleyicisi) ) şu şekilde sonlandırabilirsiniz:

buildscript {
    repositories {
        mavenLocal()
        jcenter()
    }
    dependencies {
        classpath 'io.spring.gradle:dependency-management-plugin:1.0.0.RELEASE'
    }
}

repositories {
    mavenLocal()
    jcenter()
}

apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'

dependencyManagement {
    imports {
        mavenBom 'io.spring.platform:platform-bom:Athens-SR3'
    }
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'

    testCompile 'org.springframework.boot:spring-boot-starter-test'
}

Bunu not et io.spring.platform:platform-bomorg.springframework.boot:spring-boot-starter-parentSpring Boot ile uyumlu olması için ebeveyn olarak sahip

Gerçek bağımlılık çözümünü şu yollarla doğrulayabilirsiniz:

$ gradle dependencies
$ gradle dependencies --configuration compile
$ gradle dependencies -p $SUBPROJ

$ gradle buildEnvironment
$ gradle buildEnvironment -p $SUBPROJ

veya görevle:

task showMeCache {
    configurations.compile.each { println it }
}

Resmi Soring blog gönderisini okuyun Gradle'ın tanıtımının nedenini anlamak için daha iyi bağımlılık yönetimiio.spring.gradle:dependency-management-plugin .


1

Sen edebilirsiniz merkezileştirme kodunun altına kullanarak bağımlılık:

İçinde gradle.properties

COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.1
TARGET_SDK_VERSION=26
MIN_SDK_VERSION=14

ANDROID_SUPPORT_VERSION=26.0.2

Her modülde build.gradleşunları ekleyin :

android {
    compileSdkVersion COMPILE_SDK_VERSION as int
    buildToolsVersion BUILD_TOOLS_VERSION as String

    defaultConfig {
        minSdkVersion MIN_SDK_VERSION as int
        targetSdkVersion TARGET_SDK_VERSION as int
        versionCode 1
        versionName "1.0"

    }

}

dependencies {
 compile "com.android.support:appcompat-v7:${ANDROID_SUPPORT_VERSION}"
 compile "com.android.support:support-v4:${ANDROID_SUPPORT_VERSION}"
 compile "com.android.support:support-annotations:${ANDROID_SUPPORT_VERSION}"
 compile "com.android.support:support-vector-drawable:${ANDROID_SUPPORT_VERSION}"
 compile "com.android.support:design:${ANDROID_SUPPORT_VERSION}"
}


0

Gradle dosyanızı temiz tutmak için, bağımlılığı bir dizide gruplayabilir ve daha sonra uygulayabiliriz.

  1. Bağımlılık bloğunun dışında build.gradle'da (uygulama düzeyi) bunun gibi kitaplıkların sürümünü ekleyin :

// kitaplığın sürümlerini bildir

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
  1. Daha sonra kolayca bulabilmeniz için bir dizi ilgili bağımlılık oluşturun. Bunu , bağımlılık bloğunun dışında build.gradle'a (uygulama düzeyi) ekleyin :

// Kitaplıkta sürüm kullanmak ve erişim adıyla birlikte bağımlılık eklemek (retrofit (ilk) gibi)

final networkDependencies = [
        retrofit             : "com.squareup.retrofit2:retrofit:${RetrofitVersion}",
        retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}",
        retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}",
        okHttp3              : "com.squareup.okhttp3:okhttp:${OkHttpVersion}",
        okHttp3Logging       : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}"
]
  1. Ve bağımlılık bloğunda :

// Dizideki tüm bağımlılığı uygulayın

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation networkDependencies.values()
}

Yani son kod şöyle görünecek:

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'

final networkDependencies = [
        retrofit             : "com.squareup.retrofit2:retrofit:${RetrofitVersion}",
        retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}",
        retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}",
        okHttp3              : "com.squareup.okhttp3:okhttp:${OkHttpVersion}",
        okHttp3Logging       : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}"
]

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation networkDependencies.values()
}

buna açıklama işlemcisi nasıl eklenir
lombok
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.