Gradle单构建和所有Gradle复合构建的jar文件映射

Gradle单构建和所有Gradle复合构建的jar文件映射,gradle,checkstyle,Gradle,Checkstyle,我们有这样一个目录结构 爪哇 build/build.gradle(这还不存在,但我们需要它) 服务器 server1/build.gradle server2/build.gradle 图书馆 lib1/build.gradle lib2/build.gradle 我们有11台服务器和14个库,它们对依赖项的使用各不相同。每个服务器都是只依赖于库的复合构建(我们不允许服务器相互依赖)。这样,随着mono repo的发展,打开server1不会随着越来越多的gradle代码

我们有这样一个目录结构

  • 爪哇
    • build/build.gradle(这还不存在,但我们需要它)
    • 服务器
      • server1/build.gradle
      • server2/build.gradle
    • 图书馆
      • lib1/build.gradle
      • lib2/build.gradle
我们有11台服务器和14个库,它们对依赖项的使用各不相同。每个服务器都是只依赖于库的复合构建(我们不允许服务器相互依赖)。这样,随着mono repo的发展,打开server1不会随着越来越多的gradle代码的添加而变得越来越慢(也就是说,gradle只加载server1及其所有库,其他库或服务器都不会加载以保持速度)

好的,我们现在遇到的一个问题是重复,这就是为什么我们需要build/build.gradle文件,并且我们希望mono repo中的每个模块都包含该文件,以实现几个目标(每个目标可能需要不同的解决方案)

目标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:我们希望“包括”一个标准的插件列表,因此我们在整个repo中对所有gradle插件进行相同的版本控制。虽然上面配置了所有jar,以避免mono repo中的jar地狱,但我们希望在本节中也这样做

plugins {
  id 'com.github.sherter.google-java-format' version '0.9'
}
当然,每个项目也可能希望添加一些插件,甚至不依赖于此部分(在紧急情况下,并试图完成工作)

目标3:我们希望所有项目的checkstyle配置(或任何插件配置)都定义为相同的(最终!!!)。我们希望方格格风格的gradle生活在一个公共区域,但让所有图书馆以某种方式将其引入。同样,如果它是可选的,我可以将gradle部分拉到build.gradle中,或者在紧急情况下创建一个新的部分,这样我就不必立即修复monorepo中的所有项目

理想情况下,也许我需要配置注入,当我运行server1/build.gradle时,它实际上以父级的形式运行java/build/build.grade,但有覆盖(如果我声明“extends xxx.gradle”可能),那么它使用的所有库也都使用java/build/build.gradle作为它们的父级。我不确定这是否可能或可行。我很确定gradle中不存在“extends xxx”

这些目标中有任何一个是可能的吗

谢谢,
Dean

我有点困惑,为什么不使用“标准”gradle顶级构建文件,并将其他构建文件组合为。 这解决了你所有的3个目标

如果您关心构建速度,只需运行

./gradlew :server1:build

但是,如果由于某种原因无法执行此操作,则可以使用所述的
apply from:
语法

我有点困惑,为什么不使用“标准”渐变顶级构建文件并将其他构建文件组合为。 这解决了你所有的3个目标

如果您关心构建速度,只需运行

./gradlew :server1:build

但是,如果由于某种原因您无法做到这一点,您可以使用所述的
apply from:
语法

我一直在使用与您完全相同的要求开发monorepo,也使用gradle复合构建。我们解决这个问题的方法是使用


你需要做一个新的gradle项目,其中只包含你想要共享的代码。这将创建一个插件,您可以将其添加为复合构建并应用于其他项目。

我一直在开发一个monorepo,其需求与您完全相同,同时使用gradle复合构建。我们解决这个问题的方法是使用


你需要做一个新的gradle项目,其中只包含你想要共享的代码。这将创建一个插件,您可以将其作为复合构建添加并应用于其他项目。

因为在100台服务器、187个库的情况下,每个开发人员在该插件上的加载时间==非常慢(即,该解决方案的扩展性不好)。如果您在monorepo中工作,其中所有项目都在一个git中,那么当您只加载团队所需的内容时,这真是太棒了。如果你像你说的那样加载,事情会变得非常缓慢,非常迅速@哈达奇。monorepo比artifactory做得更好,artifactory中的人们往往会意外破坏其他团队(这实际上是不可能的,因为正确的monorepo设置消除了太多的问题)。Twitter运行的monorepo要大得多。我甚至调查了gradle(twitter使用裤子),但gradle对真正的大规模monorepo的支持还没有真正到位。我认为越来越多的人会做出改变(我知道我在一家快速monorepo公司工作后做了……这太神奇了)
apply from:
我在上面的回答中提到的方法届时会起作用。它允许你在保持每个“subrepo”独立的同时构建一个构建。太棒了!!!我错过了最后一句话。我的天啊,如果真是这样的话,那就糟了。谢谢我希望我能为mono repo将所有第三方jar压缩成一个gradle文件(是的,当有人升级jar时,所有的库和服务都可以一次性完成)。因为在100台服务器、187个库的情况下,每个开发人员的加载时间==慢得像垃圾一样(即,该解决方案不能很好地扩展)。如果您在monorepo中工作,其中所有项目都在一个git中,那么当您只加载团队所需的内容时,这真是太棒了。如果你像你说的那样加载,事情会变得非常缓慢,非常迅速@哈达奇。monorepo比artifactory做得更好,artifactory中的人们往往会意外破坏其他团队(这实际上是不可能的,因为正确的monorepo设置消除了太多的问题)。Twitter运行的monorepo要大得多。我甚至查看了gradle(twitter使用裤子),但是