使用Gradle构建Monorepo项目

根据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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】广东开放大学 国际私法 形成性考核 (41)

选择题 题目&#xff1a;下列哪些情况适用我国有关法律&#xff1f;&#xff08; &#xff09; 题目&#xff1a;我国法律规定司法协助的内容包括&#xff08; &#xff09;。 题目&#xff1a;采取民事登记婚姻方式是结婚的实质要件。&#xff08; &#xff09; 题目&#xff…

【渝粤教育】广东开放大学 工商企业文化 形成性考核 (55)

选择题 题目&#xff1a;企业制度能否对企业管理起作用&#xff0c;关键在于“自律”和“他律”的相结合&#xff0c;即企业管理制度和&#xff08; &#xff09;的相融合&#xff0c;这才有可能达到企业的均衡发展。 题目&#xff1a;任何的企业管理制度&#xff0c;再好的企业…

uniapp怎么引入css_CSS 三种基础选择器

本节我们来学习 CSS 中的选择器&#xff0c;选择器是 CSS 里面一个很重要的概念&#xff0c;HTML 中的所有标签样式&#xff0c;都是通过不同的 CSS 选择器进行控制的。我们只需要通过选择器&#xff0c;就可以对不同的 HTML 标签进行选择&#xff0c;并指定各种样式声明。在 C…

万网绑定二级域名_Hexo+yilia主题网站绑定个性域名

上篇我们已经成功部署了自己的博客网站&#xff0c;初始化的网站看上去似乎少了些内容(高端大气上档次的设置)。接下来我们就进一步完善我们的博客网站(孟繁胜游)。绑定个性域名当你打开github给你设定的固定域名时&#xff0c;是不是感觉low极了。主要是github给你的域名在你注…

guava缓存数据到本地_扩展Guava缓存以溢出到磁盘

guava缓存数据到本地缓存使您可以轻松地显着加速应用程序。 Java平台的两种出色的缓存实现是Guava缓存和Ehcache 。 尽管Ehcache功能丰富得多&#xff08;例如其Searchable API &#xff0c;将缓存持久化到磁盘或溢出到大内存的可能性&#xff09;&#xff0c;但与Guava相比&am…

【渝粤教育】广东开放大学 性考 形成性考核 (33)

选择题 题目&#xff1a;GATT缓和了国际贸易()有效地促进了国际贸易的发展。 题目&#xff1a;WTO的公平竞争原则要求在WTO框架下,成员方应()采取扭曲市场竞争的措施 题目&#xff1a;技术法规般涉及国家安全、()、环境保护、劳动保护、节能等方面技术法规还涉及到与产品特性、…

jmeterhttp代理服务器_Jmeter使用HTTP代理服务器录制

1、添加线程组2、线程组下&#xff0c;添加录制控制器3、添加HTTP代理服务器&#xff0c;右键单击测试计划添加→非测试元件→HTTP代理服务器。1)HTTP代理服务器配置&#xff0c;目标控制器选择测试计划>线程组>录制控制器&#xff1b;端口号随便输入一个&#xff0c;与浏…

【渝粤教育】广东开放大学 文化田野调查 形成性考核 (22)

选择题 题目&#xff1a; 文化遗产主要是指的非物质文化遗产。 答案&#xff1a;看左侧 题目&#xff1a; 县级以上人民政府根据非物质文化遗产保护、保存工作需要&#xff0c;组织非物质文化遗产调查。非物质文化遗产调查由县级以上研究部门负责进行。 答案&#xff1a;看左侧…

GraalVM上的Picocli:极快的命令行应用程序

GraalVM GraalVM允许您提前将程序编译为本地可执行文件。 与Java VM相比&#xff0c;生成的程序具有更快的启动时间和更低的运行时内存开销。 这对于通常是短暂的命令行实用程序尤其有用。 GraalVM对Java反射的支持有限&#xff0c;它需要提前了解反射访问的程序元素。 反射访…

【渝粤教育】广东开放大学 标准化理论与方法 形成性考核 (50)

选择题 题目&#xff1a; 我国的标准层级分为&#xff08;&#xff09;级。 答案&#xff1a;看左侧 题目&#xff1a; 国家标准中"要求”属于必备要素&#xff0c;也是规范性技术要素。 答案&#xff1a;看左侧 题目&#xff1a; &#xff0c;标准可分为国际标准、区域标…

【渝粤教育】广东开放大学 社会保障学 形成性考核 (34)

选择题 题目&#xff1a;乡政府现要对申请低保的村民张三进行资格调查&#xff0c;按照法律规定&#xff0c;不属于调查范围的是&#xff08; &#xff09; 题目&#xff1a;我国现行《失业保险条例》所指失业人员为 &#xff08; &#xff09; 题目&#xff1a;《失业保险条例…

es数据频繁的更新_es之文档更新过程中并发冲突问题

1&#xff1a;乐观锁控制ES是分布式的&#xff0c;也是异步并发的&#xff0c;我们的复制请求是并行发送的&#xff1b;这就意味着请求到达目的地的顺序是不可控制的&#xff0c;是乱序的&#xff1b;如果是乱序的方式&#xff0c;很有可能出现这样的一个问题&#xff0c;新ver…

【渝粤教育】广东开放大学 网络编程技术 形成性考核 (57)

选择题 题目&#xff1a;在JavaScript中&#xff0c;运行以下代码&#xff1a; var flagtrue; document .write(typeof(flag)); 值是( )。 题目&#xff1a;下面的代码( )能在页面中弹出提示框&#xff0c;并且输入框中默认无任何内容 题目&#xff1a;在JavaScript中&#xff…

【渝粤教育】广东开放大学 金融学 形成性考核 (37)

选择题 题目&#xff1a;金融体系中居于联接宏微观的纽带和运作核心地位的是&#xff08; &#xff09; 题目&#xff1a;对居民盈余与赤字的管理选择&#xff0c;说法正确的是&#xff08; &#xff09; 题目&#xff1a;从形式上看&#xff0c;收入可分为&#xff08; &a…

面试题目_总结面试中 promise 相关题目的套路

Promise 作为当下主流的异步解决方案&#xff0c;在工作中和面试中常常出现&#xff0c;尤其是在面试中&#xff0c;会弄个场景让你手写代码&#xff0c;这里给大家介绍五道比较有代表性的题目&#xff0c;以便熟悉一些套路。promise 简单介绍先简单介绍下 PromisePromise 对象…

javafx 自定义控件_JavaFX自定义控件– Nest Thermostat第1部分

javafx 自定义控件几周前&#xff0c;由于Hendrik Ebbers的出色文章 &#xff0c;我决定花一些时间观看有关JavaFX的JavaOne讨论。 我不得不说我已经学到了很多东西&#xff0c;只是看这些视频&#xff08;即使我还没有完成&#xff09;&#xff01; Gerrit的“使用力&#xf…

【渝粤教育】电大中专Office办公软件 (4)作业 题库

1.以下软件不属于系统软件的是&#xff08; &#xff09;。 A.Visual Studio 2019 B.MySQL 5.7 C.Windows 10 D.Office 2016 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.学习好Office办公软件这门课程&#xff0c;应该&#xff08; &#xff09;。 A.重视…

【渝粤教育】电大中专中药学基础作业 题库

试卷答案 1.首创按药物自然属性进行分类的本草著作是&#xff08;&#xff09;。 A.《神农本草经》 B.《本草经集注》 C.《本草纲目》 D.《新修本草》 E.《本草拾遗》 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2.载药数最多的本草著作是&#xff08;&#xff…

不等号属于不等式吗_考研专业课备考时,仅仅多刷几遍目标院校的期末考试题就够吗?...

考研专业课备考时&#xff0c;仅仅多刷几遍目标院校的期末考试题就够吗&#xff1f;也许这要看各专业情况&#xff0c;部分专业的考研题和本科生的期末考试题难度类似&#xff0c;比如说人文社科类的专业&#xff0c;这也是我的猜测情况。大部分专业的专业课题目难度&#xff0…

使用Spring Boot和H2可以完全工作的原型

我们确实在弹簧上使用了很多h2&#xff0c;特别是对于单元测试。 但是&#xff0c;我们可能希望拥有一个功能齐全的原型来显示数据&#xff0c;而不是进行单元测试。 H2是最理想的选择&#xff0c;它在spring上运行良好&#xff0c;与大多数数据库都具有良好的语法兼容性&…