AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

npm 官宣:未来将支持 monorepo 特性,带来源码管理新姿势!

  • 2019-08-02
  • 本文字数:1671 字

    阅读完需:约 5 分钟

npm官宣:未来将支持monorepo特性,带来源码管理新姿势!

npm 存在的问题

从架构的角度来看,将大型单体代码库拆分为较小的、独立封装的一系列模块通常是个好方法。从微服务到可复用组件库,很多技术都很适合模块化。但从版本发布和源代码管理的角度来看,它也可能是一场噩梦。


  • 当项目有数十乃至数百个代码存储库时,发现工作也变得愈加困难。每当创建一个新的存储库,所有人必须将其添加到自己的代码模块中。

  • 访问控制成了单调乏味的工作,且容易出错,尤其是得在“需要了解”的基础上一次一个地授予存储库访问权限,实在令人头疼。新员工经常要经历无止境的依赖项地狱。每个访问请求都会引出它们需要访问的另外两个存储库来。

  • 高度模块化的架构也使版本控制变复杂了。我们可以让一系列相关模块的版本同步更新,给它们做“快照”(例如 Babel 和 React 就是这么做的)。但要让人们为那么多的包做这种工作(还包括和他们没什么关系的包)就是在自找麻烦。

  • 包之间的依赖项重复会大大增加安装依赖项所需的时间。一些生态系统(特别是 npm)是高度模块化的。模块化会鼓励复用,但也意味着某些包可能在你开发的每个包里都复制了一份。

解决方案

Monorepo 是针对这个问题的流行解决方案。它意味着你会将所有模块放在同一个代码存储库中,而不是每个模块配一个代码存储库。然后开发者在开发应用时只用这个“monorepo”就够了。由于所需的内容都放在了一起,发现、访问控制和版本控制工作都变得更加简单。


显然,代价就是你只能对所有代码做整体权限控制。但如果你能接受这一点,monorepo 就能在兼顾模块化所有优势的前提下提供非常简单的源代码管理方法。


那么 monorepo 怎样搭配 npm 使用呢?最受欢迎的两大解决方案分别是 Yarn workspaces 和 lerna。由于 lerna 支持 npm,让我们来看看它是如何实现 monorepo 的。


首先我们全局安装 lerna。


$ npm install -g lerna
复制代码


接下来,我们需要创建新的 lerna 存储库:


$ mkdir monorepo_example$ cd monorepo_example$ lerna init
复制代码


查看 lerna.json 可以看到版本和包的定义位置。


$ cat lerna.json{“packages”: [“packages/*”],“version”: “0.0.0”}
复制代码


如上所示,我们的 monorepo 中所有包的版本都是 0.0.0。但是我们的 monorepo 中还没有任何包。在我们添加包之前应该先登录到我们的存储库,以便 lerna 在每个新包上正确设置 publishConfig。


如果你要发布在公共 npm 存储库之外的位置上(例如 npm Enterprise),则首先需要设置你的存储库。


$ npm config set registry https://registry.npm.yourcompany.com
复制代码


接下来,我们用具有发布权限的用户登录到存储库中。如果你的包没有作用域,则可以省略-scope 标志。


$ npm login -scope test
复制代码


现在为我们的 monorepo 添加一些定域包(scoped package)。


$ lerna create @ test / a$ lerna create @ test / b$ lerna create @ test / c
复制代码


如果你为每个包选择了默认设置,那么现在测试域内会有三个包(a、b、c),版本为 0.0.0。在更新版本之前,我们需要提交已完成的工作的并为 git 创建一个远程连接:


$ git add。$ git commit -m “Initial commit”$ git remote add origin git@github.com:username/reponame.git$ git push -u origin master
复制代码


现在我们可以使用一个命令来更新所有包的版本。


$ lerna version major
复制代码


此命令不仅会将每个包都更新到 1.0.0,还会为你推送版本更新到 git。最后一步是将这些包发布到 npm。Lerna 用一个命令就能完成这个任务。


$ lerna publish from-git
复制代码


这条命令成功运行后,你就成功将第一个 monorepo 中的所有包都发布到 npm 了。万岁!


我们总结一下:


  1. 用 Lerna 创建一个新的 monorepo。

  2. 为我们的 monorepo 添加了三个新的定域包。

  3. 更新了所有包的版本并使用一条命令提交给了 git。

  4. 使用一条命令将所有包发布到了 npm 存储库。


有关 Lerna 的更多信息,包括解决重复问题的方案,建议查阅他们提供优秀的文档

未来计划

我们也很高兴地宣布,我们计划为 npm@7 带来一流的 monorepo 支持。如果你在搭配 monorepo 使用 npm,我们需要你的反馈!请告诉我们你对目前的 monorepo 解决方案的看法。


编程愉快!


英文原文:https://blog.npmjs.org/post/186494959890/monorepos-and-npm


2019-08-02 18:313644

评论

发布
暂无评论
发现更多内容

开发者,有没有完全自主的国产化数据库技术?

Albert Edison

数据库 云原生 中间件 8月月更 开源SPL

武汉大数据培训班学习要多久

小谷哥

聊天平台源码:选好框架是搭建聊天平台的基础

开源直播系统源码

软件开发 直播系统源码 语音直播系统 语音聊天app

网易伏羲4篇论文入选ACM MM2022,再创游戏AI领域佳绩

网易伏羲

人工智能 机器学习 算法 强化学习

2022飞天技术峰会:硬之城如何基于 SAE 打造数智化电子工业互联网平台

阿里巴巴中间件

阿里云 Serverless 云原生 数智化

大数据编程培训班怎么样?

小谷哥

全球健康药物研发中心郭晋疆:多元科学计算系统在药物研发管线中的搭建与实践

阿里云弹性计算

药物研发 高性能计算 EHPC

Java: 为Word文档添加水印

Geek_249eec

Java word 水印 watermark

开放下载 | 飞天技术峰会-云原生加速应用构建分论坛资料开放下载

阿里巴巴中间件

阿里云 阿里云云原生

2022年最新【Java经典面试800题】面试必备,查漏补缺;多线程+spring+JVM调优+分布式+redis+算法

Geek_Yin

编程 程序员 金九银十 #java Java面试八股文

站吗?站啊!一站式研发管理工具 ONES 团队版免费啦

万事ONES

火力全开!鲲鹏应用创新大赛2022区域赛即将陆续开赛

科技热闻

字节大佬的「算法界Top1笔记」火爆Github,短时间获上万star

Geek_Yin

编程 程序员 数据结构 算法 #java

上海大数据培训学习怎么样

小谷哥

通过部署流行 Web 框架掌握 Serverless 技术

阿里巴巴中间件

阿里云 Serverless 云原生 函数计算

直播预告(本周六)|关于数据可观测性的精彩讨论

观测云

Zebec社区利好频传,Galaxy Project上领取专属Zebec OAT

股市老人

编程培训班怎么才能选择出靠谱?

小谷哥

Python自学教程2:大牛们怎么写注释

和牛

Python 测试 8月月更

K8s小白?应用部署太难?看这篇就够了!

北京好雨科技有限公司

Kubernetes 云原生

web前端课程培训班哪里好?

小谷哥

报名 | 业务出海如何构建数据底座新范式?StarRocks 和 AWS 邀您同塑新思维

StarRocks

数据库

正式线上环境下微服务平台落地实践

HelloGeek

微服务 微服务架构 Spring Cloud Service Mesh 服务网格 mesh

FlyFish|前端数据可视化开发避坑指南(二)

云智慧AIOps社区

JavaScript 大前端 低代码 数据可视化 大屏可视化

jdk11或以上的module错误

Geek_5829b6

jdk Module

2022秋招,Java岗最全面试攻略,吃透25个技术栈Offer拿到手软

Geek_Yin

编程 程序员 java面试 金九银十 #java

你需要的露营预约管理系统来啦!最新的露营案例奉上!

天天预约

SaaS应用 预约工具 露营 营地管理

首发!这份阿里架构大神编写的K8S+SpringCloud笔记,真是大厂入场券

了不起的程序猿

Java k8s JAVA开发 java程序员

Monorepo 能给前端工程带来什么

领创集团Advance Intelligence Group

前端工程师 Monorepo

21个赛区,7大赛题,鲲鹏应用创新大赛2022区域赛期待与你相遇

科技热闻

npm官宣:未来将支持monorepo特性,带来源码管理新姿势!_编程语言_npm 博客_InfoQ精选文章