Monorepo中lerna run --scope与yarn workspace命令差异及选型指南
lerna run --scope 与 yarn workspace 命令区别及选型建议 核心区别
两个命令基础功能都是在Monorepo的指定子包内执行脚本,但底层逻辑和能力差异较大:
- 执行逻辑不同
yarn workspace <package-name> <command>是Yarn原生提供的能力,仅会定位到指定子包的目录,直接执行对应命令,不会处理子包间的依赖关系,也没有额外的前置校验逻辑。lerna run --scope <package-name> <command>是Lerna提供的任务调度能力,默认会按照子包的拓扑依赖顺序执行:如果当前指定的包依赖了其他同仓库的子包,且这些依赖包也有同名命令需要执行,Lerna会先跑完所有依赖包的对应命令,再执行当前包的命令。比如A包依赖B包,执行lerna run build --scope A时会先跑B包的build,再跑A包的build,换成Yarn命令则只会直接执行A包的build,不会处理B包的编译状态。
- 扩展能力不同
- Lerna的run命令支持大量可选参数,比如
--stream实时输出子包日志、--parallel并行执行多包命令、--include-dependencies/--include-dependents连带执行依赖/被依赖包的同名命令,还支持任务缓存、增量执行等高阶能力,这些都是Yarn原生workspace命令不具备的。 - Yarn的workspace命令能力更轻量化,仅能完成「在指定包执行某命令」的单一需求,无额外扩展参数。
- Lerna的run命令支持大量可选参数,比如
- 依赖要求不同
- 只要项目使用Yarn作为包管理器且开启了workspaces配置,不需要安装额外依赖就可以使用
yarn workspace命令。 lerna run命令需要项目中安装了Lerna依赖才可以使用。
- 只要项目使用Yarn作为包管理器且开启了workspaces配置,不需要安装额外依赖就可以使用
实际选型建议
- 仅需要临时执行简单脚本、不需要考虑依赖包前置执行的场景,优先用
yarn workspace,执行速度更快,无额外依赖要求。 - 执行build、test这类和子包依赖顺序相关的命令,或者需要用到并行执行、日志格式化、任务缓存等能力的场景,优先用
lerna run --scope,不需要手动处理依赖顺序,开发效率更高。 - 如果你的Lerna开启了Nx集成(新版Lerna默认开启),
lerna run会自带任务缓存能力,重复执行相同命令会直接读取缓存,执行效率远高于Yarn原生命令,这种场景优先选择Lerna的命令。
内容的提问来源于stack exchange,提问作者loveyunk
相关产品推荐
相关产品推荐

