在 Gradle 中,如何在一个地方声明公共依赖项



在Maven中,有一个非常有用的功能,您可以在父POM的<dependencyManagement>部分中定义依赖项,并从子模块引用该依赖项,而无需指定版本或范围或其他内容。

格拉德尔有哪些选择?

您可以在父脚本中声明公共依赖项:

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

然后,从子脚本中,可以使用依赖项声明,如下所示:

dependencies {
    compile libraries.spring_core
    testCompile libraries.junit
}

若要与高级配置选项共享依赖项声明,可以使用DependencyHandler.create

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

可以在同一名称下共享多个依赖项:

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

然后,dependencies { compile libraries.spring }将同时添加这两个依赖项。

您不能以这种方式共享的一条信息是应将依赖项分配给什么配置(Maven 术语中的范围(。但是,根据我的经验,无论如何最好明确这一点。

从 Gradle 4.6 开始,文档中建议将依赖约束作为实现此目的的方法。从 https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_version:

对于较大的项目,建议的做法是声明不带版本的依赖项,并使用依赖项约束进行版本声明。优点是依赖项约束允许您在一个位置管理所有依赖项的版本,包括传递依赖项。

在父build.gradle文件中:

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

通过检查 Java 插件来包装依赖项块(... whenPluginAdded { ( 不是绝对必要的,但它随后将处理将非 Java 项目添加到同一构建中。

然后在子 gradle 项目中,您可以简单地省略版本:

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

子版本仍然可以选择指定更高版本。如果指定了较低版本,则会自动升级到约束中的版本。

这是一个

迟到的回复,但您可能还想看看:http://plugins.gradle.org/plugin/io.spring.dependency-management它提供了导入 maven 'bom' 的可能性,并重用 'bom' 中定义的定义。当逐渐从 maven 迁移到 gradle 时,这当然是一个很好的帮助!现在享受它。

正如 datta 在他们的回答中所说,Gradle 现在有一个名为版本 catalogs.
下面是 Kotlin DSL(*.kts 文件(的示例。请注意,我使用的是 Gradle 7.4。

settings.gradle.kts中定义依赖关系:

// Configure dependencies aspects applied to all projects
dependencyResolutionManagement {
    // By default, repositories declared by a project will override the ones here.
    // You can change this behavior with the repositoriesMode property.
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    // Define repositories for all projects
    repositories {
        mavenCentral()
        maven("https://jitpack.io")
    }
    versionCatalogs {
        create("libs") {
            // Versions are useful specially when you have libraries with the same
            // group and version which are updated together with the same version
            version("room", "2.4.1")
            //       │       │
            //       │       └───> The version notation
            //       └───> Your desired name (alias)
    
            library("material", "com.google.android.material:material:1.4.0")
            //       │           │
            //       │           └───> The dependency notation (coordinates)
            //       ├───> Your desired name (alias); only letters, digits and _ - .
            //       └───> Note that _ - . will all be normalized to .
    
            // You can configure the version as you would in a regular build file
            // Note that the group and module are separate parameters
            library("junit5", "org.junit.jupiter", "junit-jupiter").version {
                prefer("5.8.0")
            }
    
            // Using the same version for multiple dependencies
            library("room-ktx", "androidx.room", "room-ktx").versionRef("room")
            library("room-runtime", "androidx.room", "room-runtime").versionRef("room")
        }
    }
}

build.gradle[.kts]中的用法:

dependencies {
    implementation(libs.material)
    implementation(libs.room.ktx)
    implementation(libs.room.runtime)
    testImplementation(libs.junit5)
}

如您所见,您不仅可以声明依赖项,还可以在此处声明存储库(而不是在顶级构建脚本中使用allprojects块来定义所有子项目的存储库(。

有关上述解决方案的时髦语法以及有关版本目录以及集中存储库和依赖项配置的更多信息,请参阅 Gradle 官方指南。

io.spring.gradle:dependency-management-plugin插件在

新的 Gradle 3.x 系列中存在问题,但在 2.x 系列中稳定。有关参考,请查看错误报告 放弃对 Gradle 3 #115 的支持

如果是 Spring(BOM 使用的主要推动者(,您可以以以下结尾:

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

请注意,io.spring.platform:platform-bom org.springframework.boot:spring-boot-starter-parent作为父级,因此它与 Spring Boot 兼容

您可以通过以下方式验证实际的依赖项解析:

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

或任务:

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

阅读官方 Soring 博客文章 更好的依赖管理,让 Gradle 了解引入io.spring.gradle:dependency-management-plugin的原因。

我更喜欢在根项目中创建包含内容的 common_dependencies.gradle 文件

buildscript {
ext {
    commonDependencies = [
            redis      : 'redis.clients:jedis:3.6.3',
            lettuce    : 'io.lettuce:lettuce-core:6.1.4.RELEASE'
      ]
   }
}

然后在根/子模块的 build.gradle

apply from: rootProject.file("common_dependencies.gradle")
dependencies {
    commonDependencies.values().forEach {
        implementation it
    }
}

从 gradle 7.1.1 开始,您可以使用版本目录

https://docs.gradle.org/current/userguide/platforms.html

https://melix.github.io/blog/2021/03/version-catalogs.html

您可以使用

以下代码集中依赖关系:

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

在每个模块中添加到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}"
}

这篇博文建议将依赖项和组作为配置进行管理:https://www.javacodegeeks.com/2016/05/manage-dependencies-gradle-multi-project-build.html

我自己没有尝试过,但它看起来很有趣。

根项目 build.gradle

subprojects {
  configurations {
    commonsIo
  }
  dependencies {
    commonsIo 'commons-io:commons-io:2.5'
  }
}

子项目 build.gradle

configurations {
  compile.extendsFrom commonsIo
}

为了保持 gradle 文件的整洁,我们可以将依赖项分组到数组中并在以后实现它们。

  1. 依赖项块之外的build.gradle(应用程序级别(中添加这样的库版本:

声明库的版本

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
  1. 创建相关依赖项的数组,以便以后可以轻松找到它。将其添加到依赖项块之外的build.gradle(应用程序级别(中:

在库中使用版本并添加依赖项以及访问权限 名称(如改造(第一个((

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. 依赖块中:

实现数组中的所有依赖项

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

所以最终的代码将如下所示:

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

相关内容

  • 没有找到相关文章

最新更新