关于 lerna 运行本地和全局的问题

来源:4-12 import-local执行流程深度分析

起点丶

2021-07-06 01:04:28

webstorm 下打开 lerna 3.22.1 的源码,终端输入 lerna -v 打印出当前项目的版本

http://img.mukewang.com/climg/60e33a9009e0202813651200.jpg


而在 vscode 打开同一个项目,终端输命令 lerna -v 却是全局安装的 lerna 4.0.0 的

http://img.mukewang.com/climg/60e33a5d09aa9bff08251051.jpg


单独在终端运行也是走的全局的 lerna 4.0.0版本

http://img.mukewang.com/climg/60e33d5b09779e6705680189.jpg

这就让我很纳闷了,琢磨半天也没想通,求老师解惑

我的系统是 windows 的,终端在 vscode 和 webstorm 上用的全是 git 的 bash 

写回答

1回答

扬_灵

2021-07-06

同学你好,从上图来看在webstorm查询lerna版本的时候是进入了项目中的node_modules中去获取版本,而在vscode中是直接从全局获取的lerna版本,你可以在vscode中打断点看一下这里import-local执行流程。

0
hunlg
hp>如果使用和老师同一个版本的 import-local 是可以正常运行的,但是 import-local 做了一次升级,增加了一些判断,结合上面的回答,可以看一下这个问题 import-local调试lerna源…-慕课网 (imooc.com),升级后的源码如下:

module.exports = filename => {
const globalDir = pkgDir.sync(path.dirname(filename));
const relativePath = path.relative(globalDir, filename);
const pkg = require(path.join(globalDir, 'package.json'));
const localFile = resolveCwd.silent(path.join(pkg.name, relativePath));
const localNodeModules = path.join(process.cwd(), 'node_modules');
const filenameInLocalNodeModules = !path.relative(localNodeModules, filename).startsWith('..');

// Use `path.relative()` to detect local package installation,
// because __filename's case is inconsistent on Windows
// Can use `===` when targeting Node.js 8
// See https://github.com/nodejs/node/issues/6624
return !filenameInLocalNodeModules && localFile && path.relative(localFile, filename) !== '' && require(localFile);
};

结合上面的回答,

filenameInLocalNodeModules 

总为 true。因此总是以全局的lerna来运行。

h021-08-28
共7条回复

2024版 Web前端架构师

2024版 ,前端高手课!全局架构思维/系统培养大厂P7技术专家/中小厂前端Leader

1125 学习 · 2255 问题

查看课程