关于lerna调试import-local未优先使用本地lerna

156 阅读1分钟

import-local库的作用

通常来讲,全局安装一个脚手架后,本地是不需要安装脚手架的。但是当我们本地安装脚手架的时候,意味着我们项目里用到了这个脚手架。当与全局冲突的时候,比如全局和本地都有这个脚手架,但是版本不同,那么我们应该使用本地的脚手架。这就是import-local的作用。

问题

当全局和本地均安装lerna时,全局v7.0.1,本地v6.4.1,根据lerna源码(如下),会优先执行本地脚手架。但实际运行lerna list未打印using local version of lerna

const importLocal = require("import-local");

if (importLocal(__filename)) {
  require("npmlog").info("cli", "using local version of lerna");
} else {
  require(".")(process.argv.slice(2));
}

全局import-local源码调试分析

对全局import-local进行debug发现,relativePathdist\\cli.js,导致后续localFile查找本地lerna为undefined,最后也就没有走本地lerna了。

image.png

原因

lerna旧版本如v3.22.1,lerna打包后cli路径为/lerna/cli,而新版本调整了打包路径为/lerna/dist/cli.js,可以认为是个bug吧。

image.png

image.png

解决

本地调试解决方案,可以修改全局源码,将relativePath手动replace下。

const relativePath = path.relative(globalDir, normalizedFilename).replace('dist\\','');