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

标签 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目录。 (Project C下的libs目录仅供Project C使用)
  3. 项目父目录中的共享库目录。

但是,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/

相关文章:

gradle 中的 Tomcat 依赖

android - 为什么 Android 不使用最新的 gradle 版本?

gradle - Gradle根项目取决于子项目的构建

Android支持库、编译SDK版本和最低SDK版本

Android SDK 26 构建错误

android - 无法将 react-native 应用程序安装到移动设备中(从服务器 : Forbidden) 收到状态代码 403

html - 如何在libgdx中使用Gradle部署HTML项目

gradle:排除所有 - 除了一个文件

android - 如何在一个Android Studio项目中构建两个Android应用程序?

Android Gradle 同步 "Tag Mismatch!"错误