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

时间:2015-08-07 19:35:41

标签: 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

项目依赖:

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

每个项目都可以从三个地方之一获得依赖:

  1. mavenCentral
  2. 来自其自己的根目录的libs目录。 (libs下的Project C目录仅供Project C使用)
  3. 项目主目录中的
  4. Shared libs目录。
  5. 然而,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为什么这个方法看起来很难维护。

1 个答案:

答案 0 :(得分:2)

这个答案显然已经很晚了,但我想我会把它发布给遇到这个问题的其他人(正如我所做的那样)。在子项目的build.gradle中,而不是写:

repositories { ... }

你可以写:

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

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