写点什么

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:313672

评论

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

前端线下面授培训机构该怎么选择

小谷哥

翻过三座大山:MatrixOne从 NewSQL 到 HTAP 分布式架构演进

MatrixOrigin

分布式数据库 MatrixOrigin MatrixOne 架构升级

KubeVela:云原生应用和平台工程之路

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

华为云助力制造业解决数字化转型困局:高效上云,加速创新

科技怪授

借力函数计算 FC,HEROZ 打造专业级 AI 日本将棋服务

阿里巴巴云原生

阿里云 云原生 函数计算

华为云助力制造业高效实现数字化转型

科技怪授

3DCAT实时云渲染助力数字孪生检修车间建设,为智能制造赋能!

3DCAT实时渲染

数字孪生 实时渲染 3D实时云渲染

如何使用文件传输协议ftp,教你使用文件传输协议命令行

镭速

华为云开源项目OpenTiny的TinyCLI是什么时候开源的?

英勇无比的消炎药

前端 开源项目 cli UI组件库

Excelize 发布 2.7.1 版本,Go 语言 Excel 文档基础库

xuri

开源 编程 Excel Go 语言 Excelize

阿里正式加入ChatGPT战局,“通义千问”上线后表现如何?

引迈信息

AI 阿里 低代码 语言模型 ChatGPT

华为云推出场景化解决方案帮助制造企业加速数字化转型

科技怪授

如何解决制造企业数字化转型中的数据散乱和管理难题,实现顺利转型?

i生活i科技

趣谈之什么是 API 货币化?

API7.ai 技术团队

api 网关 APISIX api 货币化

新晋 Committer 也有 “产学研联动”?速来围观不同视角共建 IoTDB 社区的故事!

Apache IoTDB

IoTDB Apache IoTDB

面试造火箭?GitHub 飙升“2023(Java 岗)面试真题汇总”转载 40 万

三十而立

“PMC零距离” 赖晖:在 IoTDB 我实现了参与贡献共识协议的兴趣方向!

Apache IoTDB

IoTDB Apache IoTDB

IoTDB Raft协议核心研发宋子阳成为Ratis Committer:分布式IoTDB深度并创新运用Raft协议保障高可用

Apache IoTDB

IoTDB Apache IoTDB

前端技术培训学习哪个机构靠谱?

小谷哥

华为云ERP上云解决方案助力企业迈向云端,提升业务效率与安全性

i生活i科技

时序数据库能做什么|用 GreptimeDB 进行程序员键盘行为分析,最高频按键竟然是它

Greptime 格睿科技

云原生 时序数据库 数据库·

MobTech MobPush|推送的下发逻辑是什么样的

MobTech袤博科技

技术实力与社区贡献的双重认可!乔嘉林成为 Apache 软件基金会 Member

Apache IoTDB

IoTDB Apache IoTDB

历史性的时刻!华为云跨端、跨框架开源组件库项目 OpenTiny 正式升级 TypeScript,10 万行代码重获新生!

英勇无比的消炎药

开源 前端 UI组件库

阿里巴巴内网 Java 面试 2000 题解析(2023 最新版

三十而立

【亲测有效】30 岁测试工程师的 12 个破除内卷技能!

禅道项目管理

职场 互联网人 敏捷测试 测试工程师

ChatGPT-5到底有多强?Battle!咱貌似也不输呀!

加入高科技仿生人

人工智能 AI 低代码 ChatGPT GPT-4

软件测试/测试开发丨该如何测客户端专项测试?

测试人

软件测试 自动化测试 测试开发 专项测试

码头风云——5G降临

白洞计划

5G 智慧码头

不想做架构师的Gopher不是好程序员

王中阳Go

Docker 高效工作 学习方法 面试题 Go 语言

Go 语言读取文件的几种方式

宇宙之一粟

Go 语言

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