gpt4 book ai didi

gradle - 如何让子项目在多项目构建中选择自己的存储库配置?

转载 作者:行者123 更新时间:2023-12-02 08:28:30 24 4
gpt4 key购买 nike

我对使用构建工具和在一般的多项目环境中工作还不熟悉,但我会尽力解释。

结构

这是目录结构。 (实际上有更多模块,但为了这个问题的目的,我试图保持简单)

Project vcs repo root
+---Project A/
| build.gradle
| settings.gradle
|
+---Project B/
| build.gradle
|
+---Project C/
| | build.gradle
| \---libs/
|
+---Project D/
| build.gradle
| settings.gradle
|
+---Shared libs/
|
\---build.gradle

项目依赖性:

  • A 取决于 BC
  • D 取决于 BA

每个项目都可以从三个位置之一获取其依赖项:

  1. mavenCentral
  2. 它自己的根目录中的libs目录。 (Project C下的libs目录仅供Project C使用)
  3. 项目父目录中的共享库目录。

但是,libs 文件夹内容不能保证采用某种格式(它不是包含所有 jar 的目录,可能有子目录等)

目标

我希望每个项目都可以从项目的根目录构建,并且我不想在父项目构建中保留子项目的存储库/依赖项的冗余副本。我只需在父级的构建文件中提供子项目的位置和可能的版本号。

我的尝试

C/build.gradle中:

apply plugin: 'java'
repositories {
mavenCentral()
def myLibsDir = 'libs'
flatDir name: 'Foo', dirs: "$myLibsDir/foo/4.20"
//and then do a similar thing for shared libs if needed.
}

dependencies {
// atrifacts we can get from mavenCentral or 'C/libs/foo/4.20'
}

这对于 Project C 来说效果很好,所有任务都按预期工作。

然后在设置A时:设置.gradle:

includeFlat 'Project B', 'Project C'

构建.gradle:

repositories {
mavenCentral()
def sharedLibsDir = '../Shared libs'
flatDir name: 'Blazer', dirs: "$sharedLibsDir/blz/pls/13.37"
}
dependencies {
//non-subproject dependencies
compile project('Project B')
compile project('Project C')
}

几乎有效。唯一的问题是,与依赖项不同,每个子项目的存储库{}都会被忽略,而会使用父项目的存储库。因此,如果 C 依赖于 C/libs 中的某些内容,我必须将其包含在 A/build.gradle 存储库中{}

我的猜测是我也可以使用类似 this 的东西然后直接依赖子项目的工件。我不知道为什么,但这种方法似乎更难维护。

最佳答案

这个答案显然迟到了,但我想我会把它发布给遇到这个问题的其他人(就像我一样)。在子项目的build.gradle中,不要写:

repositories { ... }

你可以写:

[rootProject, this].each {
it.repositories { ... }
}

这可以有效地将存储库 block 复制到当前子项目以及充当根的任何项目。根项目不再需要了解其依赖项所需的存储库,这应该使其更易于维护。

关于gradle - 如何让子项目在多项目构建中选择自己的存储库配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31885361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com