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

gradle项目 构建

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

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

没有复合建筑的生活

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

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

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

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

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

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

相关文章

jsoup爬虫教程技巧_Jsoup V的幕后秘密:优化的技巧和窍门

jsoup爬虫教程技巧我们已经把事情做好了&#xff0c;现在是时候加快工作速度了。 我们会牢记Donald Knuth的警告&#xff1a;“大约97&#xff05;的时间我们应该忘记效率低下&#xff1a;过早的优化是万恶之源”。 根据Jonathan Hedley的介绍&#xff0c;他使用YourKit Java …

DOM(document object model),文档对象模型

DOM 将标记语言文档一次性加载进内存中&#xff0c;在内存中形成一棵 DOM 数。

php 获取请求设备,php – 如何获取设备令牌

我有一个iOS应用程序,我想集成推送通知.我见过tutorial on youtube,一切都还可以,但最近我使用的是开发证书(用于测试 – 不用于AppStore),我的服务器上有PHP脚本.在这个文件中存储了deviceToken,它有我的iPhone并且用php变量$deviceToken编写.但是现在,当我想在AppStore中使用…

java项目使用junit_在Java 8之前的项目中使用JUnit 5

java项目使用junit这篇文章演示了如何在Java 8之前的项目中使用JUnit 5&#xff0c;并解释了为什么它是一个好主意。 JUnit 5至少需要Java 8作为运行时环境&#xff0c;因此您想将整个项目更新为Java8。但是有时由于某些原因&#xff0c;您无法立即将项目更新为Java8。例如&am…

set cache php,TP5之Cache的原理及使用

在当今大流量的互联网之中&#xff0c;Cache的重要性不言而喻。ThinkPhp5作为国内主流框架&#xff0c;提供了强大的Cache功能。让我们跟随本文&#xff0c;来剖析TP5 Cache的原理及使用。为什么需要Cache(缓存)?假设现在有一个小说网,有非常多的读者,有一篇新的章节更新了,那…

IntelliJ IDEA for Mac 项目窗口详解(Project Windows)

Show Members&#xff1a;显示成员&#xff0c;打勾&#xff0c;类的成员&#xff0c;例如&#xff1a;方法、字段等会显示出来&#xff0c;如下图所示&#xff1a; Show Excluded Files&#xff1a;显示排除的文件 Show Visibility Icons&#xff1a;显示可见性图标&#xff…

jdk9与jdk11哪个好_JDK 9、10和11中的安全性增强

jdk9与jdk11哪个好缩短JDK发布周期的原因之一是有可能推出更快的安全错误修复和增强功能。 在本文中&#xff0c;我们将简要回顾一下最新JDK版本中引入的主要安全增强功能。 由于这些增强功能中的大多数与TLS相关&#xff0c;因此必须了解TLS握手过程&#xff0c;如下图所示&am…

对一个java源文件进行正确编译,给定如下一个Java源文件Child.java,编译并运行Child.java,以下结果正确...

给定如下一个Java源文件Child.java&#xff0c;编译并运行Child.java&#xff0c;以下结果正确答&#xff1a;编译错误&#xff1a;没有找到构造器 Parent1()中国大学MOOC: 图像分割是基于灰度值的两个基本特性()答&#xff1a;相似性 连续性合同是平等主体之间的 法律行为。答…

多云平台_多云系统的授权

多云平台这是我目前正在使用的项目设计&#xff0c;用于消耗SPIFFE&#xff08; 受所有人保护的安全生产身份框架&#xff08; &#xff09;的信任和身份识别&#xff0c;在WSO2的Prabath Siriwardena先生的启发下&#xff0c;在Moratuwa大学的Gihan Dias教授的指导下&#xf…

XML的学习

文章目录XML 简介XML 语法XML 组成部分XML 约束DTD名称解释引用内部的 DTD引用外部的 DTDSchema语法格式详解命名空间前缀的意义XML 解析解析 XML 的方式&#xff08;思想&#xff09;解析器JSOUP 的使用JSOUP 入门快捷查询Jsoup 选择器查询XPathXML 简介 XML&#xff0c;Exte…

php 日期多余小时,在PHP中添加小时到日期时间

DateTime是PHP中的一个很棒的功能$string 1/1/2016 11.00PM;$date new DateTime($string);$interval new DateInterval(PT6H);$date->add($interval);// Now add another 6 hours while we are between 12:00 AM and 6:00 AMwhile($date->format(G) > 0 &&…

streaming api_通过Spring Integration消费Twitter Streaming API

streaming api1.概述 众所周知&#xff0c; Spring Integration具有用于与外部系统交互的大量连接器。 Twitter也不例外&#xff0c;而且很长一段时间以来&#xff0c;因为Spring Social一直是一个开箱即用的解决方案&#xff0c;Spring Integration利用该解决方案来连接到社交…

Linux命令之 mount -- 文件系统挂载

文章目录简介参考实例加载指定的分区参考简介 mount 命令用于加载文件系统到指定的加载点。此命令的最常用于挂载 cdrom&#xff0c;使我们可以访问 cdrom 中的数据&#xff0c;因为你将光盘插入 cdrom 中&#xff0c;Linux 并不会自动挂载&#xff0c;必须使用 Linux mount 命…

java 舍,java 4舍六入五成双

java 四舍六入五成双1. 小于5舍去&#xff0c;即舍去部分的数值小于保留部分的末位的半个单位&#xff0c;则末位不变&#xff1b;2. 大于5进1&#xff0c;即舍去部分的数值大于保留部分的末位的半个单位&#xff0c;则末位加1&#xff1b;3. 等于5时取偶数&#xff0c;即舍去部…

Linux命令之 umount -- 卸载文件系统

文章目录介绍参考介绍 umount 是“unmount”的缩写&#xff0c;译为“不挂载。所以它的”的作用是卸载已挂载的文件系统、目录或文件。 利用设备名或挂载点都能umount文件系统&#xff0c;不过最好还是通过挂载点卸载&#xff0c;以免使用绑定挂载&#xff08;一个设备&#x…

aws技术峰会2018_AWS re:Invent 2018的5大公告

aws技术峰会2018AWS re&#xff1a;Invent刚刚完成。 这是一个巨大的活动&#xff0c;在拉斯维加斯7家最大的酒店中&#xff0c;有50,000多名与会者&#xff0c;并发布了许多新的服务公告。 无服务器端通过新的lambda增强功能和更好的容器支持继续受到很多关注。 AWS通过新的“…

php 降低图像大小,PHP图像重新调整大小

我有一个PHP脚本,可以重新调整JPEG图像的大小.但是,由于某种原因,图像被扭曲,即使我将其编程为按比例计算x或y(取决于照片方向).质量是100,所以我不明白为什么它会使它们扭曲.我究竟做错了什么&#xff1f;编辑原始图像为3264px x 2448px谢谢代码&#xff1a;$im ImageCreateF…

Linux命令之 mke2fs -- 格式化分区(为分区写入文件系统)

文章目录简介命令选项参考实例格式化指定的分区简介 在磁盘分区上创建 ext2、ext3、ext4 等文件系统&#xff0c;默认情况下会创建 ext2。 虽然 mkfs 命令非常简单易用&#xff0c;但其不能调整分区的默认参数&#xff08;比如块大小是 4096 Bytes&#xff09;&#xff0c;这…

Linux格式化分区的命令

查看系统所有的文件系统&#xff1a; [~]$ df -ah Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s5s1 234Gi 15Gi 65Gi 19% 575614 682553320 0% / devfs 190Ki 190Ki 0Bi 100% 658 …