我对使用构建工具和在一般的多项目环境中工作还不熟悉,但我会尽力解释。
结构
这是目录结构。 (实际上有更多模块,但为了这个问题的目的,我试图保持简单)
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
取决于B
和C
。D
取决于B
和A
。
每个项目都可以从三个位置之一获取其依赖项:
- mavenCentral
- 它自己的根目录中的
libs
目录。 (Project C
下的libs
目录仅供Project C
使用) - 项目父目录中的
共享库
目录。
但是,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/