Gradle 所有 gradle 复合构建的 jar 文件的 monobuild 和映射
Gradle monobuild and map of jar files for all gradle composite builds
我们有这样的目录结构
- java
- build/build.gradle(这还不存在,但我们想要这个)
- 服务器
- server1/build.gradle
- server2/build.gradle
- 图书馆
- lib1/build.gradle
- lib2/build.gradle
我们有 11 台服务器和 14 个库,它们具有不同的依赖项用途。每个服务器都是仅依赖于库的复合构建(我们不允许服务器相互依赖)。这样,随着我们的 mono-repo 的增长,打开 server1 不会随着越来越多的 gradle 代码被添加而变得越来越慢(即 gradle 只加载 server1 及其所有库和 none 的其他库或服务器加载保持快速)。
好的,所以我们现在 运行 遇到的一个问题是重复,这就是为什么我们需要 build/build.gradle 文件并且我们希望单声道存储库中的每个模块都包含以某种方式实现几个目标(每个目标可能需要不同的解决方案)
目标 1:让 ext { … } 部分包含字符串映射到 gradle 依赖项,就像这样
deps = [
'web-webserver': "org.webpieces:http-webserver:${webpiecesVersion}",
'web-webserver-test': "org.webpieces:http-webserver-test:${webpiecesVersion}",
'web-devrouter': "org.webpieces:http-router-dev:${webpiecesVersion}"
]
通过这种方式,我们希望我们所有的项目都像这样导入依赖项
compile deps['web-webserver']
目标 2:我们想要 'include' 一个标准的插件列表 所以我们在 repo 中对所有 gradle 插件进行相同的版本控制。虽然上面配置了所有 jar 以避免 mono-repo 中的 jar hell,但我们只想对这一部分做同样的事情
plugins {
id 'com.github.sherter.google-java-format' version '0.9'
}
当然,每个项目可能还希望添加更多插件或者甚至不依赖于此部分(在紧急情况下并试图完成工作)。
目标 3:我们希望 checkstyle 配置(或任何插件配置)为所有项目定义相同(最终!!!)。我们希望 checkstyle gradle 位于公共区域,但所有库都以某种方式将其引入。同样,它是可选的,我可以将 gradle 部分引入我的 build.gradle 或者可以在紧急情况下创建一个新的,这样我就不必立即修复 monorepo 中的所有项目。
理想情况下,也许我有点想要配置注入,当我 运行 server1/build.gradle 时,它实际上 运行s java/build/build.grade 因为它是父级但有覆盖(如果我声明 'extends xxx.gradle' 可能)那么它使用的所有库也使用 java/build/build.gradle 作为它们的父级.我不确定这是否可能或可行。我很确定 'extends xxx' 不存在于 gradle.
中
这些目标中的任何一个都是可能的吗?
谢谢,
院长
我有点困惑,为什么您不只使用“标准”gradle 顶级构建文件,而将其他文件组合成 subprojects。
这解决了您的所有 3 个目标
如果您担心构建速度,您可以通过 运行
单独定位每个服务器
./gradlew :server1:build
但是如果您由于某种原因不能这样做,您可以使用 apply from:
语法 here
我一直在开发一个与您有完全相同要求的 monorepo,也使用 gradle 复合构建。我们解决这个问题的方法是使用 pre compiled plugins
您需要创建一个新的 gradle 项目,其中仅包含您要共享的代码。这将创建一个插件,您可以将其作为复合构建添加并应用于其他项目。
我们有这样的目录结构
- java
- build/build.gradle(这还不存在,但我们想要这个)
- 服务器
- server1/build.gradle
- server2/build.gradle
- 图书馆
- lib1/build.gradle
- lib2/build.gradle
我们有 11 台服务器和 14 个库,它们具有不同的依赖项用途。每个服务器都是仅依赖于库的复合构建(我们不允许服务器相互依赖)。这样,随着我们的 mono-repo 的增长,打开 server1 不会随着越来越多的 gradle 代码被添加而变得越来越慢(即 gradle 只加载 server1 及其所有库和 none 的其他库或服务器加载保持快速)。
好的,所以我们现在 运行 遇到的一个问题是重复,这就是为什么我们需要 build/build.gradle 文件并且我们希望单声道存储库中的每个模块都包含以某种方式实现几个目标(每个目标可能需要不同的解决方案)
目标 1:让 ext { … } 部分包含字符串映射到 gradle 依赖项,就像这样
deps = [
'web-webserver': "org.webpieces:http-webserver:${webpiecesVersion}",
'web-webserver-test': "org.webpieces:http-webserver-test:${webpiecesVersion}",
'web-devrouter': "org.webpieces:http-router-dev:${webpiecesVersion}"
]
通过这种方式,我们希望我们所有的项目都像这样导入依赖项
compile deps['web-webserver']
目标 2:我们想要 'include' 一个标准的插件列表 所以我们在 repo 中对所有 gradle 插件进行相同的版本控制。虽然上面配置了所有 jar 以避免 mono-repo 中的 jar hell,但我们只想对这一部分做同样的事情
plugins {
id 'com.github.sherter.google-java-format' version '0.9'
}
当然,每个项目可能还希望添加更多插件或者甚至不依赖于此部分(在紧急情况下并试图完成工作)。
目标 3:我们希望 checkstyle 配置(或任何插件配置)为所有项目定义相同(最终!!!)。我们希望 checkstyle gradle 位于公共区域,但所有库都以某种方式将其引入。同样,它是可选的,我可以将 gradle 部分引入我的 build.gradle 或者可以在紧急情况下创建一个新的,这样我就不必立即修复 monorepo 中的所有项目。
理想情况下,也许我有点想要配置注入,当我 运行 server1/build.gradle 时,它实际上 运行s java/build/build.grade 因为它是父级但有覆盖(如果我声明 'extends xxx.gradle' 可能)那么它使用的所有库也使用 java/build/build.gradle 作为它们的父级.我不确定这是否可能或可行。我很确定 'extends xxx' 不存在于 gradle.
中这些目标中的任何一个都是可能的吗?
谢谢, 院长
我有点困惑,为什么您不只使用“标准”gradle 顶级构建文件,而将其他文件组合成 subprojects。 这解决了您的所有 3 个目标
如果您担心构建速度,您可以通过 运行
单独定位每个服务器./gradlew :server1:build
但是如果您由于某种原因不能这样做,您可以使用 apply from:
语法 here
我一直在开发一个与您有完全相同要求的 monorepo,也使用 gradle 复合构建。我们解决这个问题的方法是使用 pre compiled plugins
您需要创建一个新的 gradle 项目,其中仅包含您要共享的代码。这将创建一个插件,您可以将其作为复合构建添加并应用于其他项目。