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

Gradle 如何让子项目在多项目构建中选择自己的存储库配置?,gradle,build.gradle,Gradle,Build.gradle,一般来说,我对使用构建工具和在多项目环境中工作还不熟悉,但我会尽我所能解释清楚 结构 这是目录结构。(实际上还有更多的模块,但为了回答这个问题,我尽量保持简单) 项目依赖性: A取决于B和C D取决于B和A 每个项目都可以从以下三个位置之一获取其依赖关系: 中央的 一个libs目录,从它自己的根目录开始。(Project C下的libs目录仅供Project C使用) 项目父目录中的共享libs目录 但是,不能保证libs文件夹的内容是特定格式的(它不是一个包含所有jar的dir,可能存在子

一般来说,我对使用构建工具和在多项目环境中工作还不熟悉,但我会尽我所能解释清楚

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

项目依赖性:

  • A
    取决于
    B
    C
  • D
    取决于
    B
    A
每个项目都可以从以下三个位置之一获取其依赖关系:

  • 中央的
  • 一个
    libs
    目录,从它自己的根目录开始。(
    Project C
    下的
    libs
    目录仅供
    Project C
    使用)
  • 项目父目录中的共享libs
    目录
  • 但是,不能保证libs文件夹的内容是特定格式的(它不是一个包含所有jar的dir,可能存在子dir等)

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

    我的尝试 在
    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'
    }
    
    这对于
    项目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')
    }
    
    这几乎奏效了。唯一的问题是,与依赖项不同,每个子项目的
    存储库{}
    被忽略,而使用父项目的。因此,如果
    C
    依赖于
    C/libs
    中的某些内容,我就必须将其包含在
    A/build.gradle
    存储库{}


    我猜我也可以使用类似的东西,然后直接依赖子项目的工件。Idk为什么确切地说,但是这个方法似乎更难维护。

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

    repositories { ... }
    
    你可以写:

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

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

    我建议您使用root build.gradle文件的subprojects{}块为所有子项目声明公共存储库。存储库的可传递重用不受设计支持。嗯,我希望不是这样。无论如何,感谢@ReneGroeschke的确认。在子项目{repositories{}和子项目的build.gradle文件中使用
    apply from:'.''.'
    怎么样?它似乎在我的初步测试工作,但idk如果这是一个特殊情况。(我只是希望两者保持同步)我很难在评论中解释,所以如果不清楚,请告诉我&我会写一个答案。
    [rootProject, this].each {
        it.repositories { ... }
    }