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项目 构建
gradle项目 构建_使用Gradle构建Monorepo项目相关推荐
- gradle构建_指定Gradle构建属性
gradle构建 属性是用于轻松自定义Gradle构建和Gradle环境的宝贵工具. 我将在本文中演示一些用于指定Gradle构建中使用的属性的方法. Gradle支持项目属性和系统属性 . 这篇文章 ...
- java gradle构建_在Gradle中为JPMS构建Java 6-8库
java gradle构建 通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS( Java平台模块系统 )的Java 6-8库. 介绍 如果您需要JPMS ...
- 前端项目结构构建_如何通过构建项目成为更好的前端开发人员(包括想法)
前端项目结构构建 If you want to fast-track your growth as a front-end developer, nothing beats doing real de ...
- 机器学习特征构建_使用Streamlit构建您的基础机器学习Web应用
机器学习特征构建 Data scientist and ML experts often find it difficult to showcase their findings/result to ...
- java web构建_使用Java构建一个宁静的Web服务
java web构建 介绍 (Introduction) Due to its exponential growth, REST(Representational State Transfer) ha ...
- angular搭建项目步骤_建立健康的Angular项目应采取的步骤
angular搭建项目步骤 by Ashish Gaikwad 通过Ashish Gaikwad 建立健康的Angular项目应采取的步骤 (Steps you should take to buil ...
- 子项目依赖和父项目冲突_实战 | maven 轻松重构项目
现在是微服务盛行时代,说不准哪一天领导就会让你对一个大项目进行重构.大项目的痛点:编译慢.发布繁琐等.就像下面这张图: 真的不敢动呀,一不小心就坍塌了. 比如说我们用户系统,我们可以这么重构(这里只是 ...
- java后端简历项目经历_从面试官甄别项目经验的角度,说说如何在简历中写项目经验(Java后端方向)...
在大多的JD(职位介绍)里,会写明该职位需要xx时间的相关经验,换句话说就是需要在简历中看到一定年限的相关商业项目经验,否则估计连面试的机会都没. 在本文里,不讨论这种门槛是否合理,而会以Java相关 ...
- hibernate框架构建_我们如何构建服务框架而不是框架
hibernate框架构建 目录 (Table of Contents) Introduction介绍 Building the Skeleton 建立骨架 - HTTP Endpoints -HTT ...
最新文章
- Windows 8.1 PLSQL_32连接到RHEL6.1 Oracle10gr2_64
- svg 线条动画浅尝
- python 2 days
- 映世便携音箱我对你一见钟情啦~
- TensorFlow实战——深度学习训练个性化推荐系统
- 浅谈jquery之on()绑定事件和off()解除绑定事件
- 从人与世界的关系上来看,人其实分为两部分
- B/S系统间跨域单点登录设计思路
- Github客户端下载以及使用方法
- 北京市计算机自考,【北京自考计算机上机考今起举行】- 环球网校
- 支持向量回归机(SVR)代码
- 两个PDF比较标出差异_一分钟学懂快速比较两个PPT文档差异技巧!
- 超好用的jQuery插件
- js正则去掉头尾空白符
- 记录_20190626
- 软件测试 pytest pytest的命名规则 用例的前后置 conftest.py 定制allure报告 @pytest.mark.parametrize()装饰器作数据驱动
- JavaScript高级(面向对象)
- 自己写的微信投票系统的小功能
- 矿产资源利用现状调查成果与矿产资源储量库衔接软件
- 解析TDT遇到的问题
热门文章
- CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】
- P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】
- P4103-[HEOI2014]大工程【虚树,dp】
- P1196 ssl1225-银河英雄传说【图论,并查集】
- [BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)
- codeforces E. Jamie and Tree LCA+dfs序+线段树
- 动态规划训练21 [FatMouse and Cheese HDU - 1078 ]
- 汇编语言(十二)之统计小于平均数的个数
- 输入框限定保留三位小数点
- 使用面向对象(OO)的思想,实现循环输入多个会员的信息,根据会员编号,查找会员积分