根据Wikipedia的说法 , monorepo是一种软件开发策略,其中许多项目存储在同一存储库中。 这种策略可以快速检测到因依赖关系的更改而导致的潜在问题和破坏,并且已被许多使用大型代码库的组织采用,例如Google,Facebook和Twitter。

如果碰巧将Gradle用作首选的构建工具,那么您也可以应用此策略,这要归功于3.1版中引入的Composite Builds功能(在撰写本文时,最新版本为5.0)。 让我们看一下不使用此功能时的典型monorepo工作流程。

没有复合建筑的生活

假设您刚刚在一家公司中工作,该公司的项目保存在单个存储库中。 每个项目都有一个单独的构建,并且它们之间的唯一关系是通过相互依赖来满足它们的需要。 有些项目比其他项目具有更多的依赖关系,有些项目甚至可能与其他项目没有依赖关系。

项目数量很重要; 当价格较低时,您可以说所有这些工具都可以放在一个伞项目下,就像使用Maven及其反应堆功能所做的那样。 Gradle具有类似的功能,除了在不触发所有其他项目的情况下更轻松地定位特定的构建之外。 可以这样说,Gradle的反应堆更智能,可以选择要执行的目标。

但是,当项目数量超过一打,比如说几百个时,会发生什么? 即使使用更智能的反应堆,Gradle也必须阅读所有项目的配置,然后解决适当的目标。 这肯定会花费您宝贵的日常工作时间,这是很大的禁忌。

解决方案是将每个项目分解为单独的版本。 反应堆功能已经一去不复返了,因此我们不必付出阅读和配置所有项目的代价,以后再丢弃其中的大多数项目。 但是,现在当依赖项可能引入了错误或二进制不兼容时,我们失去了做出反应的机会,这是在monorepo中组织代码的原因之一。

现在,我们必须遵循以前尝试过的

  • 在依赖项项目上进行更改。
  • 构建工件并将其发布到存储库。 大多数人都依赖快照工件。
  • 确保从属项目消耗了新发布的工件/快照。
  • 编译并运行测试以确定代码是否可以再次运行。
  • 冲洗并重复直到起作用。

这种方法的问题在于,我们浪费时间来发布中间工件,并且不时地形成表单,我们会忘记发布快照发行版,而在调试会话中花费数小时,直到我们意识到二进制文件不正确,呃。

复合材料为营救

现在让我们看看Composite Builds如何解决我们所遇到的问题。我们首先查看以下项目及其之间的依赖关系

项目1

Project2 <–取决于— Project1

Project3 <–取决于— Project2

这个小的依存关系图告诉我们,对Project1所做的任何更改都会影响Project2,进而影响到Project3,因为对Project2所做的更改也会影响Project3。 此monorepo的目录结构如下所示

.
├── project1
│   └── build.gradle
├── project2
│   └── build.gradle
└── project3└── build.gradle

在这里,我们可以看到三个项目及其各自的构建文件。 每个项目都有其自己的发布生命周期和版本,我们可以在其构建文件中观察到

project1 / build.gradle

apply plugin: 'java'group   = 'com.acme'
version = '1.0.0'

project2 / build.gradle

apply plugin: 'java'group   = 'com.acme'
version = '2.3.0'dependencies {compile 'com.acme:project1:1.0.0'
}

project3 / build.gradle

apply plugin: 'java'group   = 'com.acme'
version = '1.2.0'dependencies {compile 'com.acme:project2:2.3.0'
}

激活“复合构建”功能需要在名为settings.gradle的文件中配置项目之间的链接。 项目2和3需要此文件,因此我们的存储库如下所示

.
├── project1
│   └── build.gradle
├── project2
│   ├── build.gradle
│   └── settings.gradle
└── project3├── build.gradle└── settings.gradle

接下来,我们像这样写下项目之间的链接

project2 / settings.gradle

includeBuild '../project1'

project3 / settings.gradle

includeBuild '../project2'

大。 完成此设置后,我们现在可以通过发出以下命令来构建project3

$ cd project3
$ pwd
/tmp/project3
$ gradle classes
> Task :processResources
> Task :project2:processResources
> Task :project1:compileJava
> Task :project1:processResources
> Task :project1:classes
> Task :project1:jar
> Task :project2:compileJava
> Task :project2:classes
> Task :project2:jar
> Task :compileJava
> Task :classes

如您所见,project1和project2均已构建。 对project1进行更改并再次触发对project3的构建,将按预期构建所有三个项目。 现在,假设将此Monorepo扩展到数十个或数百个项目,您将很快意识到几乎不需要快照版本(如果有)。 Gradle还具有其他功能,例如输入/输出的任务缓存,这也使构建更快。 同样,最近宣布的构建缓存功能通过“捕获” CI服务器场中其他节点计算的输出来加快构建速度。

如果您喜欢本文,则可以在我的博客上找到有关Gradle和构建工具的其他有趣文章。

翻译自: https://www.javacodegeeks.com/2018/12/building-monorepo-projects-gradle.html

使用Gradle构建Monorepo项目相关推荐

  1. gradle项目 构建_使用Gradle构建Monorepo项目

    gradle项目 构建 根据Wikipedia的说法 , monorepo是一种软件开发策略,其中许多项目存储在同一资源库中. 这种策略可以快速检测到因依赖关系的更改而导致的潜在问题和破坏,并且已被许 ...

  2. Android Studio目录结构和Gradle构建Android项目

    一,Android Studio的目录结构和工程项目介绍 二,Eclipse工程与Android Studio工程的区别 1,Eclipse工程能导入AS运行,但AS建立的工程不能再Eclipse中运 ...

  3. gradle java ide_使用Gradle构建Java项目

    使用Gradle构建Java项目 这个手册将通过一个简单的Java项目向大家介绍如何使用Gradle构建Java项目. 我们将要做什么? 我们将在这篇文档航中创建一个简单的Java项目,然后使用Gra ...

  4. 使用Gradle构建Java项目

    使用Gradle构建Java项目 本指南将引导您使用Gradle构建一个简单的Java项目. 你会建立什么 您将创建一个简单的应用程序,然后使用Gradle进行构建. 你需要什么 约15分钟 最喜欢的 ...

  5. gradle构建web项目_25多个Web资源可帮助您构建项目

    gradle构建web项目 This article was created in partnership with Mekanism. Thank you for supporting the pa ...

  6. gradle构建android项目详解

    1.用Gradle构建 1.1 工程结构 如图所示,这是一个不能更普通的Android的Gradle工程了. 根目录下面的settings.gradle当中主要是用来include子模块的,比如我们这 ...

  7. 06、使用Gradle构建的项目如何打jar包和war包

    打jar包 打开gradle之前构建的项目,随便写一个测试类里面打印一句话. 打开idea中gradle的窗口,选择build下的jar双击执行 执行完控制台显示成功,在当前项目的目录下会有生成一个b ...

  8. 使用gradle构建android项目,Android中使用Gradle来构建App项目的入门指南

    gradle是Android开发中引入的全新的构建系统,因为全新的构建系统主要是出于下面的目的: 1. 方便复用代码和资源 2. 构建多种版本的apk更见简单,不论是为多渠道构建不同的apk还是构建不 ...

  9. gradle构建android项目

    工具: Android Studio2.0 gradle-2.10 一.Android常识 在做Android开发的时候我们首先必须要有一个SDK.一般SDK的主要作用就是将硬件和软件进行分离,做软件 ...

最新文章

  1. LeetCode 495. Teemo Attacking
  2. 02.Python基础
  3. promise的大白话讲解
  4. .NET 下载、文档访问新姿势
  5. java 类 加载 初始化_java中类的初始化和加载
  6. windows下安装TensorFlow(CPU版)
  7. 7-6 红豆生南国 (25 分)
  8. 单片机shell命令_nr_micro_shell
  9. SOCK开发之---TCP/IP简介
  10. 如何减小电压跟随器输出电阻_补课贴 | 关于运算放大器和比较器的异同,那些你不得不知道的小知识!...
  11. 用UITextView加载rtfd文件
  12. gsonformat java代码_插件GsonFormat快速實現JavaBean
  13. 使用linux批量引物设计,【分享】超实用的引物设计操作,一看就学会
  14. pycharm安装jpype报错及解决方法
  15. RGB565常见颜色对照表
  16. web前端html5+css3学习笔记(1)
  17. 思科 计算机网络 第十章测试考试答案
  18. Simulink中的虚拟和非虚拟子系统
  19. Geoserver+Geomesa+HBase时空大数据环境搭建
  20. CSK KCF(tracking)

热门文章

  1. 【分块】区间众数(金牌导航 分块-1)
  2. Nacos(五)之Spring集成
  3. 汇编语言(三十五)之输入字符串以$结束然后输出字母个数
  4. Node.JS第二讲笔记
  5. 致我们最最最最最最最最最最最最最优秀的班主任——王老师
  6. 《金色梦乡》金句摘抄(六)
  7. 利用redis保存验证码并设置过期时间
  8. 继承类对方法的影响java_4-Java面向对象-继承(上)
  9. c语言 葬礼分号,其实从C语言用分号结尾开始,就是一个悲剧了……
  10. python oj 输入_Python写OJ题时输入问题