前言
lerna
是一个著名的包管理器,虽然现在pnpm
的monorepo
火的一塌糊涂,但是我认为lerna
还是相对成熟一些,毕竟@vue/cli
、create-react-app
、babel
等都是使用lerna
进行管理。同时lerna
有完整的社区,至今也已经发展到8.x
的版本,2024年,还是很有必要学习和掌握这门技术的!
开始
lerna init 初始化项目
创建一个项目
cmd
cd Desktop && mkdir lerna-demo
进入项目后,使用npm
项目初始化项目
cmd
cd lerna-demo
npm init -y
全局安装lerna
cmd
npm install lerna -g
使用vscode
打开项目后,使用lerna
初始化
cmd
lerna init
这个时候你会发现控制台报错了
网上大部分资料都是直接使用lerna init
就可以初始化项目,但是新版的lerna
(8.0
版本)脚手架需要加上--packages
的option
,详情可以看官方文档
按照文档,我们再次初始化项目
cmd
lerna init --packages="packages/*"
我们会发现,lerna
自动被安装到了devDependencies
,同时使用git
进行版本管理和创建了lerna.json
配置文件
手动修改lerna.json
中的版本号为1.0.0
lerna create 创建子项目
初始化项目后,使用lerna create
命令来创建子项目,这里我创建一个名为core
的子项目
cmd
lerna create core
需要注意的是输入package name
时,不能直接输入core
,因为这个包会被作为单独的npm
包发布,core
同名的包肯定会存在的。我们可以群组的形式创建,最终包名就是@lerna-demo/core
,类似@vue/cli
、@vue/composition-api
发布的前提是需要在
npm
官方中创建群组(例如:@learn-demo
),这个后面会讲
上面的创建步骤完成后,子项目core
的package.json
就会显示完整的包名
紧接着我们可以继续创建一个util
子项目
cmd
lerna create util
最终的目录结构如图
lerna list 查看子项目
使用list
命令可以查看被lerna
管理的子项目
cmd
lerna list
or
lerna ls
废弃的lerna add
v7
版本之前,是可以使用这个命令可以为项目安装依赖
cmd
lerna add lodash //为所有子项目安装lodash
or
lerna add lodash --scope @lerna-demo/core //给core项目安装lodash
or
lerna add lodash --scope @lerna-demo/core --scope @lerna-demo/util 给core和util安装lodash
但是从v7
之后,这个命令就被废弃了,详情见官方文档
由于我们安装的是最新版本的v8.x
,所以无法继续使用这个命令
我们如果想给项目安装依赖,使用原来的npm/yarn/pnpm
即可
根据文档,我们只需要加上-w
标识即可
cmd
npm install lodash -w packages/core
or
npm install lodash -w packages/core -w packages/util
细心的同学发现,安装后虽然显示了安装成功,但是core
或者util
目录下都没有node_modules
,它是否有正确安装了呢?
我们在core
的项目中尝试使用lodash
代码正常运行,说明lodash
已经安装成功了,但实际是被安装到了最外层的node_modules
中。这实际也是v8
版本后的改动,所有依赖都放在最外层,避免node_modules
的巨型体积问题。
lerna clean 清空依赖
除了安装依赖之外,必然少不了清空依赖。
cmd
lerna clean //清空所有项目的依赖
or
lerna clean --scope @lerna-demo/core 清空core的依赖
or
lerna clean --scope @lerna-demo/core --scope @lerna-demo/util 清空core和util的依赖
我们先看一下core
和util
项目的dependencies
执行命令后,显示成功了,但是发现dependencies
中依然存在。这样设计可能是因为lerna
可能考虑到用户需要重新安装依赖,所以没有删除。
废弃的lerna bootstrap
上面提到可能需要重新安装依赖,没错lerna
在v7
之前确实是通过bootstrap
命令实现的
cmd
lerna bootstrap //重新安装所有项目的依赖
or
lerna bootstrap --scope @lerna-demo/core 重新安装core的依赖
or
lerna bootstrap --scope @lerna-demo/core --scope @lerna-demo/util 重新安装core和util的依赖
但是和add
命令一样,这个命令也被废除了
如果需要重新安装依赖,直接使用npm/yarn/pnpm
即可, 因为dependencies
中依然存在被clean
掉的信息,所以我们随时可以重新安装这些依赖。
废弃的lerna link
link
命令在v7
版本之前被用来将子项目中相互依赖的包都在本地link 方便本地调试,例如core
中依赖了util
,所以我们可以执行:
cmd
lerna link
但是这条指令在v8
已经被废弃了
解决这个问题,我们直接安装对应的包名即可,lerna
会为我们创建对应的软链
cmd
npm install @lerna-demo/util -w packages/core
同时,会安装到core
项目的node_modules
目录下
我们尝试在core
项目中引入util
没有任何问题,在core
中可以顺利调用util
@lerna/legacy-package-management
如果你确实很需要add
、boostrap
、link
,或者旧版的lerna
升级到了最新为了适配,可以安装@lerna/legacy-package-management
来解决,这个包保留了这三个命令的使用
我们安装一下这个包:
cmd
npm install @lerna/legacy-package-management -D
试一下lerna add
cmd
lerna add axios //同时安装axios到core和util
此时,core
和util
都安装了axios
依赖,说明这个包又兼容了废弃的指令,这对那些升级lerna
需要兼容的同学是比较友好的。另外两个命令我就不试了,感兴趣的同学可以自己尝试一下。
lerna exec 执行终端命令
使用过node
的child_process
命令的同学对exec
这个方法应该都不陌生,lerna exec
也是用来代替做同样的事情,而这个上下文正是packages
目录下管理的子项目,并非是根目录,这一点需要注意
cmd
lerna exec ls //查看core和util所有文件
cmd
lerna exec --scope @lerna-demo/core -- rm -rf node_modules //删除core的node_modules
其格式是:lerna exec --scope [pkgName] -- [stream]
lerna run 执行npm script
run
命令和exec
命令很像,一般使用run
命令大都是执行子项目中script
脚本的命令,例如一键启动项目,或者一键打包等等
cmd
lerna run dev //一键启动所有项目
or
lerna run build --scope @lerna-demo/core //打包core项目
如果有指定npm/yarn/pnpm
的需求,也是可以做到的,通过--npm-client
即可,可选值有:npm/yarn/pnpm
cmd
lerna run test -- npm-client yarn //使用yarn来执行test脚本
发布
上述一系列操作基本都是在开发阶段时使用的,现在来讲一下发布阶段如何使用lerna
进行管理。但是在使用lerna
为我们发布管理之前,前提是需要将项目管理git
仓库,这个是前提!
lerna diff 查看版本差异
使用这个命令的前提是需要有commit
记录,拿当前改动与commit
进行比较,功能和git diff
一致
将之前的代码提交后,随意修改一个文件
只有有文件改动,就可以使用diff
查看
lerna version 更新项目版本号
使用version
命令可以更新项目版本号,目前core
和util
都是1.0.0
版本,执行这条命令的前提是不能有文件改动(所有改动已被提交)
cmd
lerna version
此时版本号已经更新了,但是控制台报错了,原因是因为我之前把packag-lock.json
加入到了.gitignore
中
我们去掉packag-lock.json
,同时加入lerna-debug.log
,并且撤销package.json
和lerna.json
的修改,同时生成一条新的commit
记录。
再次执行lerna version
,更新版本号
命令执行成功,并且向远程仓库推送了tag
版本号:1.0.1
lerna publish 发布
publish
命令会将项目发布到npm中,执行这个命令,首先会执行一遍lerna version
的操作,由于我们用的是@lerna-demo/xxx
这种群组的形式,前提是需要在npm
中创建这个群组
但是很不幸,@lerna-demo
这个群组已经被创建了!(狗头),所以后面的流程就没办法演示下去了(懒得换个名字了,哈哈)。只要创建完群组之后,执行lerna publish
即可,会同向远程仓库推送新的tag
标签,并且会发布到npm
仓库中。
其它
除了上述常见用法之外,还有一些冷门的指令,我们可以通过lerna -h
查看
lerna info
打印本地环境的调试信息lerna add-caching
生成任务运行器配置的交互式提示符lerna changed
列出自上一个带标签的版本以来已更改的本地包lerna repair
运行自动迁移以修复知识库的状态lerna watch
每当包或其依赖项更改时,运行命令lerna import
将包导入到带有提交历史记录的monorepo
中
这几个命令平时不怎么用,根据自己需要的使用即可。
总结
本文从0到1,完整的带你使用leran
进行多包管理。看完全文,我相信你一定掌握了lerna
的用法!