背景
对于同时要维护多个npm包的同学来说,包管理是个令人头疼的问题,这些包是放在一个仓库还是放在分开的仓库,包数量少的时候,包的维护不会有太多的问题,但是当包的数量越来越多,就会出现越来越多的问题:
1.包之间的依赖关系如何管理
2.包的版本如何进行更替升级
带着这些问题,我们来看下lerna
lerna
什么是lerna?看下lerna的定义
A tool for managing JavaScript projects with multiple packages. Lerna is a tool that optimizes the workflow around managing multi-package repositories with git and npm.
翻译: Lerna 是一个用来优化托管在gitnpm上的多package代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题。
从定义可以看出,可以解决上面提出的问题,更为开发人员提供了一种管理多个包的方式。比如有A包和B包,A包依赖B包,改了B包之后,用lerna发布的时候,会同时发布A和B两个包,而这个依赖关系不用你去记住,lerna会帮你解决这一切~关于包的版本管理后面再说~
使用
lerna配置
lerna初始化项目,运行如下命令
npm i lerna -g
lerna init
然后会生成以下目录结构
| packages
| lerna.json
| package.json
lerna.json的配置文件
{
"packages": [
"packages/*" //存放包的文件夹,可以配置多个
],
"version": "1.0.0",//lerna版本号
"command": {
"publish": {
"message": "chore(release): publish %s" //发布时的日志格式
}
},
"ignoreChanges": [
"**/*.md"
]
}
常用命令
安装依赖
为packages文件夹下的package安装依赖
lerna add <package>[@version] [--dev] # 命令签名
//例子
lerna add module-1 --scope=module-2 # 将 module-1 安装到 module-2
lerna add module-1 --scope=module-2 --dev # 将 module-1 安装到 module-2 的 devDependencies 下
lerna add module-1 # 将 module-1 安装到除 module-1 以外的所有模块
lerna add babel-core # 将 babel-core 安装到所有模块
卸载依赖
lerna exec -- <command> [..args] # 在所有包中运行该命令
//例子
lerna exec --scope=npm-list yarn remove listr # 将 npm-list 包下的 listr 卸载
lerna exec -- yarn remove listr # 将所有包下的 listr 卸载
删除安装依赖
lerna clean
查看包是否发生了变化
lerna updated/diff
显示packages下的所有package的版本
lerna ls
查看本地所有包列表
lerna list
发布包
lerna publish
发布前查看哪些包发生了变化
lerna changed
lerna工作流
lerna的工作流如下
lerna bootstrap // 安装依赖包
lerna list // 本地依赖包
lerna changed // 待发布包列表
lerna publish // 发布包
版本管理
lerna有两种版本号,集中版本号和独立版本号
fix(固定模式):包发布新版本的时候,发布的包会升级到lerna的version字段的版本,所以有些包可能会出现跳版本的情况,但是发布的时候打的tag只有一个。
independent(独立模式):包发布新版本的时候,会逐个询问需要升级的版本号,基准是它本身的package.json,就不会出现上面跳版本的问题,但是因为每次发布都会打tag,这样包的数量较多的时候,会出现一次发布5个包的话,会多5个tag
如果需要各个组件维护自身的版本号,那么就使用independent模式,只需要在lerna.json的version值改为independent
changelog
为了方便生成changelog和规范化提交日志,推荐使用git cz
来提交日志,这样可以用以下命令生成
conventional-changelog -p angular -i CHANGELOG.md -w -r 0 -s
这条命令的意思是生成所有发布的 Change log
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。