我是新手使用构建工具并且通常在多项目环境中工作,但我会尝试尽我所能解释。
这是目录结构。 (实际上有更多模块,但为了这个问题,我试图保持简单)
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
。每个项目都可以从三个地方之一获得依赖:
libs
目录。 (libs
下的Project C
目录仅供Project C
使用)Shared libs
目录。然而,libs文件夹内容不保证是某种格式,(它不是所有jar的dir,可能有sub dirs等)
我希望每个项目都可以从项目的根目录构建,我不想在父项目构建中保留子项目的存储库/依赖项的冗余副本。我只需要在父的构建文件中提供子项目的位置和可能的版本号。
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
时:
settings.gradle:
includeFlat 'Project B', 'Project C'
的build.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')
}
此几乎有效。唯一的问题是,与依赖项不同,每个子项目的repositories {}
都会被忽略,而父项则会被使用。因此,如果C
取决于C/libs
中的内容,我必须将其包含在A/build.gradle
的{{1}}
我的猜测是我也可以使用类似this的东西,然后直接依赖子项目的工件。 Idk为什么这个方法看起来很难维护。
答案 0 :(得分:2)
这个答案显然已经很晚了,但我想我会把它发布给遇到这个问题的其他人(正如我所做的那样)。在子项目的build.gradle中,而不是写:
repositories { ... }
你可以写:
[rootProject, this].each {
it.repositories { ... }
}
这有效地将存储库块复制到当前子项目以及作为root用户的任何项目。根项目不再需要了解其依赖者需要的存储库,这应该使其更易于维护。