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

Aar*_*jav 3 gradle build.gradle

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

结构

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

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
Run Code Online (Sandbox Code Playgroud)

项目依赖:

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

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

  1. MavenCentral
  2. 一个libs目录从它自己的根目录。(下面的libs目录Project C仅供Project C使用)
  3. Shared libs 项目的父目录中的目录。

但是,不保证 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'
}
Run Code Online (Sandbox Code Playgroud)

这适用于Project C,所有任务都按预期工作。

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

includeFlat 'Project B', 'Project C'
Run Code Online (Sandbox Code Playgroud)

构建.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')
}
Run Code Online (Sandbox Code Playgroud)

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

我的猜测是,我也可以使用像这样,然后取决于子项目的直接神器(S)。不知道为什么,但这种方法似乎更难维护。

小智 6

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

repositories { ... }
Run Code Online (Sandbox Code Playgroud)

你可以写:

[rootProject, this].each {
    it.repositories { ... }
}
Run Code Online (Sandbox Code Playgroud)

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