Lerna是啥,干吗用的,有什么好处,这里我引用官方的一段说明:node
将大型代码库拆分红独立版本的包对于代码共享很是有用。然而,跨多个存储库进行更改是混乱的,很难跟踪,跨存储库的测试变得很是复杂。
为了解决这些(以及许多其余)问题,一些项目将把它们的代码库组织到多包存储库(有时称为monorepos)中。像Babel、React、Angular、Ember、Meteor、Jest等项目,以及许多其余项目在一个存储库中开发它们的全部包。
Lerna是一个工具,它优化了使用Git和NPM管理多包存储库的工做流。
Lerna还能够减小开发和构建环境中对大量包副本的时间和空间需求,这一般是将项目划分为多个单独的NPM包的缺点。
复制代码
我举个场景来简单说明,Babel相信大多数人都用,这是个大型的开源项目,包含了core、preset和炒鸡多的plugin包等等。git
Babel6及之前的作法是,这些plugin包都是独立,版本号也独立维护,所以若是一次版本发布的时候,若是要统一版本号,就须要全部包都要写changlog,git push
和npm publish
一次,这显然是个繁琐复杂并且容易出错的过程(虽然有脚本能够解决)。github
那么有没有什么好的解决方案呢?Lerna举手回答了。npm
Babel7开始,为了规范统一管理,采用了Lerna管理项目,所以咱们在Babel仓库中能够看到packages
这个目录和Lerna的配置信息,它包含了全部官方的包,很显然解决了每一个包都git push
的问题(直接在根目录统一提交)。有人也许会举手问了,那每一个包都npm publish
这个能够解么?json
固然!Lerna有个命令就是干这样的事情,直接在根目录敲下命令lerna publish
,Lerna就自动地变动版本号,填写message,根目录git push
与全部包自动npm publish
。bootstrap
下面我简单说下怎么用。bash
Lerna官网在这里lernajs.io/,仓库在这里github.com/lerna/lerna,可先查看官方详细的文档说明。babel
Lerna有不少强大的CLI命令,我这里用的有:app
lerna init
: 初始化项目lerna bootstrap
: 自动构建项目lerna ls
: 列出当前项目全部包lerna clean
: 清理node_modules
文件夹lerna add
: 添加依赖(相似npm install)lerna publish
: 发版由于lerna publish
是集合了git push
和npm publish
的操做,所以咱们须要将项目文件夹链接到git仓库和登陆npm仓库(我这里就假设读者熟悉git
和npm
操做)。工具
从git仓库clone下来新建的项目(可在github或者gitlab建立)而且添加基本的文件,目录以下:
my-lerna-demo
|--- .gitignore
|--- README.md
复制代码
这是咱们在根目录中执行命令lerna init
就能够初始化项目了,此时目录以下:
my-lerna-demo
|--- packages #包目录
|--- .gitignore
|--- lerna.json #lerna配置
|--- package.json
|--- README.md
复制代码
而后咱们使用lerna publish
提交一次试试,执行以下命令:
> git add *
> git commit -m "init" #执行lerna publish前需提交记录这次变动
> lerna publish
lerna notice cli v3.10.5
lerna info current version 0.0.0
lerna info Looking for changed packages since initial commit.
lerna success No changed packages to publish
复制代码
如上输出信息可见,由于咱们并无建立包,所以上面操做并无成功发版。
下面咱们建立第一个包。
咱们在packages
新建目录my-lerna-module
而且在该目录使用命令npm init
初始化后随意添加一些文件,此时目录结构以下:
my-lerna-demo
|--- packages
|--- my-lerna-module
|--- package.json
|--- index.js
|--- .gitignore
|--- lerna.json #lerna配置
|--- README.md
复制代码
而后咱们再次尝试发版,执行命令和输出内容以下:
> git add *
> git commit -m "add package my-lerna-module" #执行lerna publish前需提交记录这次变动
> lerna publish
lerna notice cli v3.10.5
lerna info current version 0.0.0
lerna info Looking for changed packages since initial commit.
? Select a new version (currently 0.0.0) (Use arrow keys)
> Patch (0.0.1)
Minor (0.1.0)
Major (1.0.0)
Prepatch (0.0.1-alpha.0)
Preminor (0.1.0-alpha.0)
Premajor (1.0.0-alpha.0)
Custom Prerelease
Custom Version
复制代码
此时Lerna给了咱们版本号的选项,小beta版本就选第一个吧(此后每次变动都会递增版本号,递增位数可选)
? Select a new version (currently 0.0.0) Patch (0.0.1)
Changes:
- my-lerna-module: 1.0.0 => 0.0.1
? Are you sure you want to publish these packages? (ynH)
复制代码
此时列举并询问是否发布这些包(也就是npm publish
操做),直接输入y
,此时输出如下信息表示Lerna成功执行了发版操做。
......
Successfully published:
- my-lerna-module@0.0.1
lerna success published 1 package
复制代码
此时查看git仓库和npm仓库能够看到以下结果:
到这里咱们就使用Lerna踏出了第一步。
咱们再建立个包my-lerna-index
,而且初始化,此时目录结构以下:
my-lerna-demo
|--- packages
|--- my-lerna-module
|--- package.json
|--- index.js
|--- my-lerna-index
|--- package.json
|--- index.js
|--- .gitignore
|--- lerna.json #lerna配置
|--- README.md
复制代码
咱们使用命令lerna add
给包添加依赖,命令以下:
> lerna add cross-env #全部包都添加cross-env依赖
> lerna add my-lerna-module --scope=my-lerna-index #给包my-lerna-index添加my-lerna-module依赖
复制代码
此时咱们看到my-lerna-module
和my-lerna-indx
的package.json
都添加了以下依赖配置:
"dependencies": {
"cross-env": "^5.2.0"
}
复制代码
其中,my-lerna-index
添加了对my-lerna-module
的依赖配置:
"dependencies": {
"cross-env": "^5.2.0",
"my-lerna-module": "^0.0.1"
}
复制代码
而后咱们再次发布个小版本:
> git add *
> git commit -m "add package my-lerna-index" #执行lerna publish前需提交记录这次变动
> lerna publish
lerna notice cli v3.10.5
lerna info current version 0.0.1
lerna info Looking for changed packages since v0.0.1
? Select a new version (currently 0.0.1) Patch (0.0.2)
Changes:
- my-lerna-index: 1.0.0 => 0.0.2
- my-lerna-module: 0.0.1 => 0.0.2
? Are you sure you want to publish these packages? Yes
......
Successfully published:
- my-lerna-index@0.0.2
- my-lerna-module@0.0.2
lerna success published 2 packages
复制代码
此时咱们成功发布了个小版本0.0.2。
使用命令lerna ls
列举当前项目全部包:
> lerna ls
lerna notice cli v3.10.5
my-lerna-index
my-lerna-module
lerna success found 2 packages
复制代码
若是想清理项目下全部包的node_modules
目录,咱们可使用命令lerna clean
:
> lerna clean
lerna notice cli v3.10.5
lerna info Removing the following directories:
lerna info clean packages\my-lerna-index\node_modules
lerna info clean packages\my-lerna-module\node_modules
? Proceed? Yes
......
lerna success clean finished
复制代码
执行命令lerna bootstrap
则自动更新包的依赖信息至最新而且自动下载依赖包:
> lerna bootstrap
lerna notice cli v3.10.5
lerna info Bootstrapping 2 packages
lerna info Installing external dependencies
lerna info Symlinking packages and binaries
lerna success Bootstrapped 2 packages
复制代码
《一步步学习如何使用Lerna》到这里就结束了,本人只作了简单的案例说明(其实这是我刚学的哈),若是存在错误的地方还请大佬指出,谢谢您的阅读与支持。