Trong Gradle, làm cách nào để khai báo các phụ thuộc chung ở một nơi?


109

Trong Maven có một tính năng rất hữu ích khi bạn có thể xác định một phần phụ thuộc trong <dependencyManagement>phần của POM mẹ và tham chiếu phần phụ thuộc đó từ các mô-đun con mà không cần chỉ định phiên bản hoặc phạm vi hoặc bất cứ điều gì.

Các lựa chọn thay thế trong Gradle là gì?

Câu trả lời:


179

Bạn có thể khai báo các phụ thuộc phổ biến trong tập lệnh mẹ:

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

Từ một tập lệnh con, bạn có thể sử dụng các khai báo phụ thuộc như sau:

dependencies {
    compile libraries.spring_core
    testCompile libraries.junit
}

Để chia sẻ các khai báo phụ thuộc với các tùy chọn cấu hình nâng cao, bạn có thể sử dụng DependencyHandler.create:

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

Nhiều phần phụ thuộc có thể được chia sẻ dưới cùng một tên:

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

dependencies { compile libraries.spring } sau đó sẽ thêm cả hai phụ thuộc cùng một lúc.

Một phần thông tin mà bạn không thể chia sẻ theo cách này là cấu hình nào ( phạm vi theo thuật ngữ Maven) mà một phụ thuộc nên được gán cho. Tuy nhiên, từ kinh nghiệm của tôi, tốt hơn là nên nói rõ ràng về điều này.


3
Cảm ơn, điều này giải quyết được câu hỏi của tôi, nhưng vẫn có một mối lo ngại .. Trong Maven, chúng tôi có thể để trống phiên bản và nếu đây là lib, thật tiện lợi vì bạn có thể sử dụng nó trong ứng dụng của chúng tôi và thực hiện quản lý phụ thuộc để xác định phiên bản của lib nó sẽ mất. Làm thế nào bạn sẽ làm điều tương tự với Gradle?
Stanislav Bashkyrtsev

Tôi không hiểu câu hỏi. Vui lòng cung cấp một ví dụ.
Peter Niederwieser

4
Peter, những gì ctapobep đang nói là trong maven, bạn có thể khai báo các phụ thuộc với phiên bản (và phạm vi) trong một pom mẹ (hoặc tập hợp) trong phần dependencyManagement. Sau đó, trong pom "bê tông", bạn không cần phải khai báo lại phiên bản; chỉ tạo tác và groupId. Về cơ bản, nó nói với maven "Tôi cần X: Y, nhưng hãy sử dụng bất kỳ phiên bản nào mà cha mẹ đã định cấu hình."
Michael Campbell

2
Để tránh những loại trùng lặp, tôi có xu hướng để tạo ra một riêng biệt dependencies.gradlekịch bản mà tôi xác định tất cả phụ thuộc của tôi như tài sản, ví dụ như: ext.GROOVY = 'org.codehaus.groovy:groovy-all:2.1.6'. Trong dự án gốc build.gradle, tôi bao gồm allprojects { apply from: "$rootDir/dependencies.gradle" }. Sau đó, tất cả các phụ thuộc được xác định trong một tệp thay vì dàn trải chúng xung quanh và các hằng số "dễ đọc" hơn được sử dụng trong các cấu hình phụ thuộc.
Steinar

1
Đó chính xác là những gì tôi đã làm ở trên. Bạn không cần phải đăng ký allprojectsvì các thuộc tính bổ sung cấp dự án hiển thị cho các dự án con.
Peter Niederwieser

7

Đó là một câu trả lời muộn, nhưng bạn cũng có thể muốn xem tại: http://plugins.gradle.org/plugin/io.spring.dependency-management Nó cung cấp khả năng nhập một 'bom' maven và sử dụng lại các định nghĩa được định nghĩa trong 'bom'. Đó chắc chắn là một trợ giúp tuyệt vời khi dần dần chuyển từ maven sang gradle! Đang tận hưởng nó ngay bây giờ.


nó thậm chí còn phải có khi bạn muốn chia sẻ các phụ thuộc giống nhau trên một số (nhiều) dự án.
phòngg

7
Mặc dù tiện lợi, plugin này có thể có hiệu suất đáng kể. Đối với 30 dự án con có hơn 200 phụ thuộc, thời gian giải quyết phụ thuộc lên đến 1 phút. Đối với dự án nhỏ nó hoạt động như một nét duyên dáng, mặc dù
Jk1

nó cũng ghi đè các phiên bản phụ thuộc bắc cầu, giả sử bạn đã khai báo phiên bản 3.0.0 trong quản lý phụ thuộc, nhưng đối với một trong các dự án con, bạn cần sử dụng phiên bản cũ hơn, ví dụ 2.5.0, thì nếu bạn có một dự án phụ thuộc vào dự án cũ hơn này, phụ thuộc bắc cầu sẽ bị ghi đè từ 2.5.0 thành những gì được khai báo trong plugin quản lý phụ thuộc, vì vậy 3.0.0 trong trường hợp này là một hành vi rất kỳ lạ
KameeCoding 27/11/18

7

Kể từ Gradle 4.6, các ràng buộc phụ thuộc được đề xuất trong tài liệu như một cách để đạt được điều này. Từ https://docs.gradle.org/current/userguide/decights_dependencies.html#dec Tuyên_a_dependency_without_version :

Một thực tiễn được khuyến nghị cho các dự án lớn hơn là khai báo các phụ thuộc không có phiên bản và sử dụng các ràng buộc phụ thuộc để khai báo phiên bản. Ưu điểm là các ràng buộc phụ thuộc cho phép bạn quản lý các phiên bản của tất cả các phụ thuộc, kể cả các phiên bản bắc cầu, ở một nơi.

Trong build.gradletệp mẹ của bạn :

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

Bao bọc khối phụ thuộc bằng kiểm tra plugin Java (... whenPluginAdded { ) không hoàn toàn cần thiết, nhưng sau đó nó sẽ xử lý việc thêm một dự án không phải Java vào cùng một bản dựng.

Sau đó, trong một dự án lớp học trẻ em, bạn có thể chỉ cần bỏ qua các verison:

apply plugin: "java"

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

Các bản dựng con vẫn có thể chọn chỉ định phiên bản cao hơn. Nếu một phiên bản thấp hơn được chỉ định, nó sẽ tự động được nâng cấp lên phiên bản trong ràng buộc.


1
Các ràng buộc phụ thuộc đã được thêm vào trong Gralde 4.6, vì vậy điều này sẽ hoạt động với Gradle 4.6 trở lên.
Jim Hurne

Tôi nghĩ Gradle cung cấp rằng Plugin nền tảng Java được sử dụng trong trường hợp như vậy. Tuy nhiên, tại thời điểm này, tài liệu Gradle không rõ ràng lắm. Tôi đoán việc sử dụng allprojectscũng tốt.
JojOatXGME

tôi muốn khai báo các ràng buộc trong dự án gốc nhưng chỉ trong một trong các dự án con của tôi, tôi muốn tải tất cả các phụ thuộc đó có các ràng buộc được xác định.
dtc

2

io.spring.gradle:dependency-management-pluginplugin có vấn đề với dòng Gradle 3.x mới nhưng ổn định cho dòng 2.x. Để tham khảo, hãy xem báo cáo lỗi Hỗ trợ thả cho Gradle 3 # 115

Trong trường hợp Spring ( người quảng cáo chính của việc sử dụng BOM ), bạn có thể kết thúc bằng:

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'
}

Lưu ý rằng io.spring.platform:platform-bomorg.springframework.boot:spring-boot-starter-parentas cha để nó tương thích với Spring Boot

Bạn có thể xác minh giải pháp phụ thuộc thực tế thông qua:

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

$ gradle buildEnvironment
$ gradle buildEnvironment -p $SUBPROJ

hoặc với nhiệm vụ:

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

Đọc bài đăng trên blog chính thức của Soring Quản lý phụ thuộc tốt hơn cho Gradle để hiểu lý do giới thiệu io.spring.gradle:dependency-management-plugin.


1

Bạn có thể tập trung một phần phụ thuộc bằng cách sử dụng mã dưới đây:

Trong 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

Trong mỗi mô-đun thêm vào build.gradle:

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

Để giữ cho tệp gradle của bạn sạch sẽ, chúng tôi có thể nhóm sự phụ thuộc trong một mảng và triển khai chúng sau này.

  1. Thêm phiên bản của các thư viện như thế này trong build.gradle (cấp ứng dụng) bên ngoài khối phụ thuộc :

// khai báo các phiên bản của thư viện

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
  1. Tạo một mảng phụ thuộc có liên quan để bạn có thể dễ dàng tìm thấy nó sau này. Thêm nó vào build.gradle (cấp ứng dụng) bên ngoài khối phụ thuộc :

// Sử dụng phiên bản trong thư viện và thêm phụ thuộc cùng với tên truy cập (như trang bị thêm (trang đầu tiên))

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. Và trong khối phụ thuộc :

// Triển khai tất cả phụ thuộc từ mảng

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

    implementation networkDependencies.values()
}

Vì vậy, mã cuối cùng sẽ giống như sau:

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()
}

làm thế nào để bao gồm bộ xử lý chú thích bằng cách này ?? như trong trường hợp của lombok
Pritish Joshi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.