44

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

 5 years ago
source link: https://www.tuicool.com/articles/qimieuq
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

npm 存在的问题

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

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

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

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

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

解决方案

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

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

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

首先我们全局安装 lerna。

复制代码

$ npminstall-g lerna

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

复制代码

$mkdir monorepo_example
$cdmonorepo_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 configsetregistryhttps://registry.npm.yourcompany.com

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

复制代码

$npm login -scopetest

现在为我们的 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 [email protected]:username/reponame.git
$git push -u origin master

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

复制代码

$ lernaversionmajor

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

复制代码

$ lerna publishfrom-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


Recommend

  • 135

    张书乐:瞬时播放成盗版新姿势,网络直播此刻已无技可炫?张书乐:瞬时播放成盗版新姿势,网络直播此刻已无技可炫?2017-10-08 17:15匠心计划创作者,传媒专家,张书乐,科技领域创作者...

  • 162

    Github Demo: https://github.com/lliuguangbo/AutoSystemBar 针对状态栏,官方从4.4版本开始支持,但是4.4和5.0以上API是不同的,6.0以上提供了两种状态栏图标样式分别是白色和黑色样式。 针对状态栏图标样式的修改,小米和魅族提供额外的API,在6.0以下都支持,...

  • 116

    CVE 2017-0199漏洞利用的新姿势 2017年12月31日 by kczwa1·CVE 2017-0199漏洞...

  • 179

    JavaScript - @mmmwhy - 今天看到有人给了一个链接,在微信点开之后,会自动跳转到支付宝。忍不住把代码扒下来看了看,用到了微信的跳转 api,代码为:https://github.com/mmmwhy/mmmwhy.gi

  • 378
    • 掘金 juejin.im 6 years ago
    • Cache

    玩转Github的新姿势-github-cli

    惊鸿一瞥 这是一个可以帮助你在命令行中完成Github的各种操作的cli工具。 创建它的初衷是因为我是一个命令行狂热爱好者,与此同时我也是一个Github的fans,每当我在命令行环境中进行开发工作时,如果此时我想看看Github上又诞生了什么新的有趣的开源项

  • 80
    • 掘金 juejin.im 6 years ago
    • Cache

    RxJava 2.x入门新姿势一

    引言 经过几年的发展,响应式编程已经是很流行了,在Android开发中的应用也非常的广泛,身为Android开发者,则是必须掌握的技术。 正文 网上已经有很多很多RxJava相关的文章,视频等等教程,但是说实话对于入门,或者新手来说,确实不好理解,上来就是各种

  • 127
    • www.freebuf.com 6 years ago
    • Cache

    Windows平台下实现提权的新姿势

    在这篇文章中,我们将给大家演示如何通过无引号服务路径来实现在Windows平台下的提权。在渗透测试的过程中,当我们以本地用户身份生成命令Shell时,我们是无法检查受限文件或目录的,因此我们才需要拿到管理员访问权。

  • 88

    作者:宋成林 懒加载,一个在我们前端性能优化中高频出现的词汇,无论是懒加载图片还是懒加载模块,无非都是希望用户可以在滚动指定视区再去加载相应的资源, 从而达到节省用户流量、提升首次加载时间、减轻服务器的压力的目的。...

  • 96

    叮叮配送 - 聚合型外卖即时配送平台,更便宜、更快速的配送新姿势 - NEXT

  • 6

    两个月的时间,极果联合创维举办的创维Q71系列体验趴从南京走到西安,历经五座文化大都市,共邀请了15位来自各个领域的顶尖大咖,只为更深入品鉴8K所带来的美好,以及告诉大家8K已来的意义。的确,在这个内容大爆炸的时代,我们每个人都需要一台能带来给...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK