脚手架系列 - Lerna源码分析run命令,一通百通

284 阅读1分钟

脚手架系列

脚手架系列 - 从0制作脚手架实战

脚手架系列 - 脚手架原理

脚手架系列 - Lerna 使用介绍

脚手架系列 - 比较 lerna 和 lerna + yarn workspace 和 pnpm

脚手架系列 - Lerna源码分析run命令,一通百通

先来回顾lerna run test命令

  • 作用就是在pakcages下面执行每个项目的test命令

lerna run test 运行流程

which lerna

命令行中lerna查找对应命令是否存在,系统执行which lerna在环境变量中查找,如果找到了可执行路径地址,否则返回command not found错误

image.png

bin字段的shell脚本

打开上述路径地址,看到lerna可执行文件,打开看到内容

image.png

lerna run testnode 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

image.png

实际 index.js 注册lerna的各种命令

image.png

@lerna/cli 设置用yargs库做脚手架通用基本配置

image.png

runCmd对象导出 commanddescribebuilderhandler统一结构,handler是实际执行逻辑

image.png

RunCommand 继承 Command 固定命令流程 initializeexecute

  • Command 构造函数中 this.runCommand 规定好所有命令实现 initializeexecute image.png

image.png