脚手架系列
脚手架系列 - 比较 lerna 和 lerna + yarn workspace 和 pnpm
先来回顾lerna run test命令
- 作用就是在pakcages下面执行每个项目的test命令
lerna run test 运行流程
which lerna
命令行中lerna查找对应命令是否存在,系统执行which lerna在环境变量中查找,如果找到了可执行路径地址,否则返回command not found错误
bin字段的shell脚本
打开上述路径地址,看到lerna可执行文件,打开看到内容
lerna run test 即 node cli.js run test
上述shell脚本中,实际执行了exec node "$basedir/node_modules/lerna/cli.js" "$@",于是知道了
在命令行中执行 lerna run test
相当于执行了 node /c/Program Files/nodejs/lerna/node_modules/lerna/cli.js run test
入口 cli.js
- importLocal 库是判断用户自己项目的'node_modules'是否存在lerna,如果存在就用项目的lerna
注意:
require("npmlog").info("cli", "using local version of lerna");这句和importLocal是在一起的宏任务中,会执行npmglog这句,保证打印消息在第一行,后面命令注册是微任务队列的巧妙设计,保证当使用项目lerna时,比npmlog这句后执行。 - 否则用全局的lerna
实际 index.js 注册lerna的各种命令
@lerna/cli 设置用yargs库做脚手架通用基本配置
runCmd对象导出 command、describe、builder、handler统一结构,handler是实际执行逻辑
RunCommand 继承 Command 固定命令流程 initialize 和 execute
Command构造函数中this.runCommand规定好所有命令实现initialize和execute