繁体   English   中英

在Gradle中管理传递依赖版本

[英]Managing transitive dependency versions in Gradle

我有3个gradle项目:Project-1,Project-2,Project-3。 Project-1和Project-2是Java库,Project-3是这些库的使用者。 Project-1和Project-2都依赖于Module-A。 但是,对于它们中的每一个,我希望能够指定一列与它们兼容的确切版本。 例如,Project-1与版本1和2的Module-A兼容并经过测试,但是Project-2与版本2和3的Module-A兼容。我希望能够在构建配置中指定这些要求。每个项目。 这些依赖关系只能是基本实现,甚至可以是仅编译。

当Project-3使用Project-1和Project-2构建的库时,我想确保将Module-A解析为Project-1和Project-2中明确列出的最新版本。 否则,我想在构建步骤中得到一个错误,那就是找不到令人满意的依赖项解析。 理想情况下,我希望能够在Project-3 Gradle构建中明确指定Module-A的版本,如果与Project-1或Project-2都不兼容,则会收到错误消息。

使用Maven插件将Project-1和Project-2工件从本地Maven存储库中消费并上传到本地Maven存储库。

看看下面的方法是否有帮助。 它假定一个项目由三个模块构成,如下所示:

Top-level
├── Project-1
├── Project-2
└── Project-3

...以及您描述过的番石榴的各种版本都扮演Module-A的角色。

顶级build.gradle

ext {
  project1GuavaVersions = ['26.0-jre','27.0-jre']
  project2GuavaVersions = ['25.0-jre','26.0-jre']

  if(project1GuavaVersions.disjoint(project2GuavaVersions)) {
    throw new GradleException('No common version(s) of Guava defined')
  } else {
    project3GuavaVersion = new HashSet(project1GuavaVersions + project2GuavaVersions).max()
  }

subprojects {
  apply plugin: 'java'
}

用于为每个模块指定可接受的Guava版本的额外属性。 Project-3的版本计算为Project-1和Project-2之间使用的最新版本。 (此外,为方便起见,Java插件已应用于三个子项目)。

Project-1的build.gradle

archivesBaseName = 'project1'

repositories {
  mavenCentral()
}

dependencies {
  implementation "com.google.guava:guava:[${project1GuavaVersions.join(',')}]"
}

将插入Project-1的Guava版本的extra属性,并将其从字符串列表转换为以逗号分隔的字符串。 这使用了Gradle使用Ivy表示法指定版本范围的能力,即[26.0-jre,27.0-jre]

Project-2的build.gradle

archivesBaseName = 'project2'

repositories {
  mavenCentral()
}

dependencies {
  implementation "com.google.guava:guava:[${project2GuavaVersions.join(',')}]"
}

(类似于Project-1的实现)

Project-3的build.gradle

archivesBaseName = 'project3'

repositories {
  mavenCentral()
}

dependencies {
  implementation project(':project1')
  implementation project(':project2')
  implementation "com.google.guava:guava:$project3GuavaVersion"
}

Project-1和Project-2被定义为项目级别的依赖项,此处使用了定义为额外属性的Guava显式计算版本。

我希望能涵盖一切。 如果没有别的,我希望它能激发一些新的想法!

UPDATE

正如您在评论中提到的那样,您的项目不是分层设置的,您还可以选择以“扁平”方式设置它们,其中所有项目都位于相同的文件夹深度,例如:

(root)
├── project1
│   └── build.gradle
├── project2
│   └── build.gradle
├── project3
│   └── build.gradle
└── master
    ├── build.gradle
    └── settings.gradle

这里的“主”是一个特别命名的项目,与其他项目并列。 settings.gradle应该被移入master并且应该使用Settings.includeFlat()来指示您要包含存在于同一级别的项目:

includeFlat 'project1'
includeFlat 'project2'
includeFlat 'project3'

我最初提出的解决方案的详细信息应适用于此设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM