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

更新日期: 2019-08-02阅读: 2.7k标签: npm

npm 存在的问题

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

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

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

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

  • 包之间的依赖项重复会大大增加安装依赖项所需的时间。一些生态系统(特别是 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 git@github.com: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


链接: https://fly63.com/article/detial/4472

在5分钟内搭建企业内部私有npm仓库

下面通过三种方法来搭建公司私有npm仓库,每种方式都有自己的优势。启动并配置服务、设置注册地址、登录cnpm、包上传到私有仓库、查看预览包、通过verdaccio搭建....

使用webpack开发npm插件

webpack:解析js文件,无法解析的文件需要借助loader,npm插件发布(vue&webpack&单页面):npm init =>package.json,创建.vue文件 =>插件界面及功能,index.js =>入口文件

npm命令大全_整理NPM常用命令

NPM是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。这篇文章整理NPM常用的一些命令

npm 执行多个命令_如何用npm同时执行多条监听命令

直接通过&&连接多条命令,在npm run start的时候,发现只停留在第一个命令执行监听,后面的命令都没有执行。只能通过打开多个窗口分别执行多条命令,那么有没有办法实现一条npm命令执行多条监听呢?

npm和bower的关系和区别

npm和bower太像了,就像一对孪生兄弟…… npm的文件是package.json,包安装的目录是node_modules。 bower的文件是bower.json,包安装的目录是bower_components。使用命令也基本一致

npm run build根据不同参数打包不同环境url

这篇文章主要介绍了vue项目中Npm run build 根据环境传递参数方法来打包不同域名,使用npm run build --xxx,根据传递参数xxx来判定不同的环境,给出不同的域名配置,具体内容详情大家参考下:config文件夹下dev.env.js中修改代码、prod.env.js中修改代码 HOST为截取到的参数

npm安装模块时报错:no such file or directory

使用node.js和npm,在安装模块的时候报错npm WARN saveError ENOENT: no such file or directory, open ...的解决办法。这个原因就是因为项目没有进行初始化,缺少package.json文件造成的。需要package.json才能npm install。 可以npm init初始化生成一个package.json。

vue-cli 3.x 开发插件并发布到 npm

抽空写了一个 textarea,打算发布到 npm 的时候却遇到了问题,之前用 vue-cli 2.x 的时候,打包配置项非常透明,可以很容易的修改,但升级到 vue-cli 3.x 之后,反而一脸懵逼

前端npm 安装包,精选大全集合

如果您曾在 Node 或 JavaScript 前端开发中投入过时间和精力,那么您就知道 npm 中有数以十万计的模块可供您选择。挑选模块可能很难,但您只需要一些方法点来解决它。当您正在为如何抉择浪费时间,或者甚至不知道从哪里开始时,请使用本指南来帮助您。

关于 npm run eject 报错的问题

关于 npm run eject 报错的问题,昨天新开React的项目, 刚刚一上手就碰到问题,解决方法(前提你有git).出错的原因:应该是git没有安装好,或者代码没有提交上git

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!