gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:05:25 25 4
gpt4 key购买 nike

我有以下项目结构

-->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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com