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发现,relativePath为dist\\cli.js,导致后续localFile查找本地lerna为undefined,最后也就没有走本地lerna了。
原因
lerna旧版本如v3.22.1,lerna打包后cli路径为/lerna/cli,而新版本调整了打包路径为/lerna/dist/cli.js,可以认为是个bug吧。
解决
本地调试解决方案,可以修改全局源码,将relativePath手动replace下。
const relativePath = path.relative(globalDir, normalizedFilename).replace('dist\\','');