babel 项目的 packages 里面存放了 babel 旗下的全部包,好比:babel-core。git
咱们在安装 babel 的时候通常不是这样装的:yarn add babel
,而是这样安装的:yarn add @babel/babel-core
,这是因为 babel 进行了分包管理的缘故,又由于 npm 支持scope packages
,因此咱们能够这样子来安装包。github
咱们再来看scope packages
,npm 支持以@符开头的包名称,把它叫作有范围的包,示例:@somescope/somepackage
。npm
可是在发布包的时候,npm 会把这种包当成是你的私有包来进行发布,通常咱们是发布不了的,由于 npm 会提示须要登陆等等东西,这个时候咱们通常就加上一个参数,告诉 npm 咱们要发布的这个包是一个公共包:npm publish --access=public
,不出意外这个包就能够发布成功了。json
别人要安装你的包:yarn add @somescope/somepackage
,看起来跟安装 babel-core 一致了。babel
可是还差点东西,就是利用 lerna 来进行管理。学习
要达到相似于 babel 那样的管理方式,首先,你须要有scope packages
,正好,咱们如今有了一个@somescope/somepackage
包,如今咱们就用 lerna 来管理它。code
首先,咱们在 github 上面新建一个仓库,就叫作:testlerna 吧(使用已有仓库也行),而后克隆到本地,进入到 testlerna 目录,执行:lerna init
或者是lerna init -i
(表示 packages 下面的包单独使用版本号),这个时候,lerna 就为咱们生成了这几个东西:it
testlerna |-package.json |-lerna.json |-packages/
packages 目录就是 lerna 要进行管理的各类包的目录,全部的包都会放在这个目录下面。test
接着执行:lerna import ../scopepackage
(假设我们的这个@somescope/somepackage
包是放在 scopepackage 目录里面的),这样就会把咱们刚才发布的那个包导入到 packages 目录里面,这时候目录看起来像这个样子:import
testlerna |-package.json |-lerna.json |-packages/ |--scopepackage/ |---package.json |---...
作一些修修改改并执行 git commit 后,咱们就能够执行lerna publish
了,不出意外你的@somescope/somepackage
也在 npm 上更新了,原来的那个@somescope/somepackage
仓库能够删除掉了,由于咱们把它放在 testlerna 项目中进行管理了,这样就跟 babel 那样的管理方式同样了。
这种方式是有一丢丢麻烦,由于 npm 默认会把 @ 开头的包当成私有包来看待,就致使了若是不在 npm 上提交一次公共版本,执行lerna publish
时就会发布不了,可能lerna publish
调用的 npm 命令是npm publish
它没有加--access=publish
参数。
若是你不想这么麻烦,那么有一个办法就是,不用scope package
,也就是你的包名不加 @ 前缀,这样你的包就默认是公共的包了,彻底能够不用先去提交一次公共版本,才能使用 lerna 来管理你的包,简单多了。
更新,不用像上面那么麻烦了,还得新建一个仓库,你大能够把前面那种方法当成是学习 npm 的 scope package 吧。
正确的方式是这种:
使用 lerna init 后,packages 里面也有你的包了,这时候咱们要先进行第一次发布,直接进入 packages/你的包目录,执行:npm publish --access=public
,
发布完之后,下次你就能够在主项目里面使用:lerna publish
来管理了。