build-automation - 用于多个项目构建的多个设置 gradle 文件

标签 build-automation gradle multi-project

我有以下项目结构

-->Starnderd Location
        -->Project1 
           -->settings.gradle 
           -->build.gradle
           -->Subproject11
              -->build.gradle
           -->Subproject12
              -->build.gradle
        -->Project2 
           -->settings.gradle 
           -->build.gradle
           -->Subproject21
              -->build.gradle
           -->Subproject22
              -->build.gradle
        -->build.gradle
        -->settings.gradle

上述项目结构的想法是,我们有多个包含子项目的项目,每个项目都可以依赖于其他项目。此外,项目内的子项目可以依赖于同一项目内的其他子项目。项目将在根目录中的settings.gradle 中指定。此外,每个项目中的 settings.gradle 都会说明该特定项目的子项目是什么。

我的根目录中的settings.gradle看起来像

include 'Project1',
         'Project2'

Project1 settings.gradle 看起来像

include 'SubProject11'
         'SubProject12'

其他依赖顺序在各自的build.gradle文件中定义 如果我在根位置(标准位置)内运行 gradle clean build install ,它似乎不会使用项目级别 settings.gradle 文件中的配置。

我在这里做错了什么?

最佳答案

我能够以相对干净的方式解决这个问题。当然欢迎改进!

尽管 Gradle 不支持开箱即用的多个 settings.gradle 脚本,但可以创建单独的子项目,每个子项目都有自己的 settings.gradle 文件。假设您有一个多项目 A,它依赖于多项目 B,每个项目都有自己的子项目。您的目录结构可能如下所示:

A
- settings.gradle
- foo
- faz
\ B
  - settings.gradle
  - bar
  - bap

开箱即用,Gradle 希望 A/settings.gradle 看起来像这样:

include ':foo', ':faz', 'B:bar', 'B:bap'

这样做的问题是,每次 B 添加新项目时,即使新项目仅由 B 使用,A/settings.gradle 也必须更改。为了避免这种情况,您可以尝试在 A/settings.gradleapply B/settings.gradle 而不是添加冗余声明:

apply from: 'B/settings.gradle'
include ':foo', ':faz'

如果您尝试这样做,您会发现 Gradle 失败,因为它为 :bar:bap 生成了错误的 projectDir。它错误地假设 B 的包含相对于 settingsDir,当从该项目根调用 Gradle 时,它​​恰好是 A/。要解决此问题,您可以添加另一个脚本,例如 B/settings-parent.gradle (确切的名称并不重要):

apply from: 'settings.gradle'

def updateProjectPaths(Set<ProjectDescriptor> projects) {
    projects.each { ProjectDescriptor project ->
        String relativeProjectPath = project.projectDir.path.replace(settingsDir.path, "")
        project.projectDir = new File("B/$relativeProjectPath")
        // Recursively update paths for all children
        updateProjectPaths(project.children)
    }
}

updateProjectPaths(rootProject.children)

这会删除 settingsDir.path 并在路径前添加 B/ 前缀。通过让每个层将其自身添加到路径上,可以将其扩展到多层 settings[-parent].gradle 文件。现在您将将此脚本应用于 A/settings.gradle:

apply from: 'B/settings-parent.gradle'
include ':foo', ':faz'

通过这种方案,新的 B 项目不会不必要地破坏 A/settings.gradle,并且所有项目都可以使用,而无需显式引用 B 子项目。例如,如果':foo'想要使用'B:bap',它可以简单地声明:

compile project(':bap')

关于build-automation - 用于多个项目构建的多个设置 gradle 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12154031/

相关文章:

build - 将 TeamCity 与 MSBuild 和构建参数一起使用(未使用)

android - 无法解析 : recyclerview-1. 1.0 受影响的模块:app

git - 有没有一种方法可以在不使用个人访问 token 的情况下从脚本向 github 进行身份验证?

.net - 使用 MSBuild 压缩多个项目目录

android-studio - 自动从 NDK 库项目复制 .so 文件?

java - 如何修复Java中的 'Could not write standard input to Gradle Test Executor 1'错误

eclipse - 如何将fomatter和模板设置应用到Eclipse中的多个项目?

gradle 按需编译依赖,否则使用 jars

Gradle 多项目命名 : How can I set a property (e. g。 baseName) 用于所有子项目?

gcc - 如何在编译期间强制 cmake 包含 "-pthread"选项?