【问题标题】:how to declare dependency version in one place for many gradle projects如何在一个地方为许多 gradle 项目声明依赖版本
【发布时间】:2019-11-06 03:56:42
【问题描述】:

我的项目包含多个 grails 服务、插件和库,所有这些都是使用 gradle 构建的,它们的依赖项在 build.gradle 文件中声明,每个项目一个,我希望这是有道理的。

在 maven 中,我曾经能够在一个父项目 pom 或 pom 模板中声明所有依赖项的版本,并且只在需要它们的项目中包含依赖项而不包含版本。这使得在一个地方轻松升级依赖项。有没有简单的方法在 gradle 中做到这一点?

伪代码示例:

master_template/build.gradle

    dependencies {
        joda-time:joda-time:2.9.1
        cglib:cglib:3.2.9
        javax.servlet:javax.servlet-api:3.1.0
    }

service_a/build.gradle

    parent: master_template
    dependencies {
        joda-time:joda-time
        javax.servlet:javax.servlet-api
    }

service_b/build.gradle

    parent: master_template
    dependencies {
        cglib:cglib
        javax.servlet:javax.servlet-api
    }

【问题讨论】:

    标签: maven gradle grails groovy gradle-plugin


    【解决方案1】:

    您可以创建一个multi module project,就像在 maven 中使用父 pom 一样。

    为了管理父级中的依赖关系,我使用spring dependency management plugin

    你的父母 build.gradle 看起来像:

    subprojects {
        apply plugin: "io.spring.dependency-management"
    
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    
        check.dependsOn dependencyCheckAggregate
    
        repositories {
            mavenLocal()
            jcenter()
            // other repos
        }
    
        dependencyManagement {
    
            def jacksonVersion = "2.+"
    
            dependencies {
                dependency "com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion"
                dependency "com.fasterxml.jackson.core:jackson-core:$jacksonVersion"
                dependency "com.fasterxml.jackson.core:jackson-databind:$jacksonVersion"
                dependency "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonVersion"
                dependency "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:$jacksonVersion"
            }
        }
    }
    

    现在,您可以在不指定版本的情况下向子模块添加依赖项。

    【讨论】:

    • 看起来多模块项目必须在一个公共文件夹中。我可以在不同的存储库中执行此操作吗?例如引用 artifactory/maven jar 或 git 存储库中的模板或父级?
    • 哦,其实 gradle multiproject 并没有做依赖管理。我之前检查过guides.grails.org/grails-multi-project-build/guide/index.html,它只包括整个父配置和一堆ifs...
    • 1.是的,多模块项目必须在一个公共文件夹中 2. 依赖管理由 spring 依赖插件完成,而不是 gradle 本身。在微服务环境中工作时,我更喜欢保持依赖管理独立,因为这是微服务的主要思想之一——拥有独立的部署工件。
    【解决方案2】:

    使用 Gradle 的默认 apply from: 'other.gradle' 可以轻松实现您想要的,因此不需要额外的插件。

    在我的微服务项目中,我正在使用类似的东西:

    common-gradle/env.gradle

    apply plugin:'groovy'
    
    ext.compile = [ 'joda-time:joda-time:2.9.1', 'cglib:cglib:3.2.9` ]
    ext.testCompile = [ 'org.spockframework:spock-core:1.3-groovy-2.5' ]
    

    common-gradle/dependencies.gradle

    dependencies {
      compile ext.compile
      testCompile ext.testCompile
    }
    

    以及用法

    service_a/build.gradle

    apply from:'../common-gradle/env.gradle'
    
    ext.compile << 'ch.qos.logback:logback-classic:1.2.3'
    
    apply from:'../common-gradle/dependencies.gradle'
    

    因此,我的每个build.gradle 文件仅包含 3-5 行关键信息,例如项目名称和版本。

    您不需要在 IDE 中将 common-gradle 作为项目导入,您可以简单地使用符号链接来避免使用外部引用。同样在构建类似 Jenkins 的管道期间,您唯一需要做的就是将 common-gradle repo 检出到您的工作目录中。

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 1970-01-01
      • 2015-01-25
      • 2018-11-10
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多