问题背景
为了测试不同 Node.js 环境,开发机器上可能会安装多个不同版本的实例。大多是通过 nvm、fnm、volta 等管理工具安装 node。当你切换了不同的 Node.js 环境可能发现全局安装的依赖丢失了!还有可能你的第三方包管理工具版本会不一致!
这是因为:安装 Node 默认会自带一个 npm 可执行文件,然而不同的 Node 环境自带的 npm 版本是分开的,你可能在不同的环境中通过 npm install -g
将某个包安装了好几份、因此当你切换了 Node 版本可能导致找不到这个全局包。
如果你是用 npm install -g pnpm
安装的 pnpm,那么不同版本的 node 环境中可能下载了不同版本的 pnpm。
那么有没有一种方案,可以让安装的命令行工具不跟随 Node 版本环境变化、 pnpm 版本也不会跟着变呢?
当然是有的,pnpm 的方案目前堪称业界最佳。它的全局脚本安装位置在 Mac 上是 ~/Library/pnpm
这个目录,它可以不受 Node 版本环境变化影响。
因此我们解决的思路就是:将所有的 Node 相关命令行工具全部由 PNPM 管理,所安装的 Node 实例自带 npm 的全局安装目录里只留下它自己、以免和其他地方安装的包冲突。
但因为大多数同学安装 pnpm 都是通过 npm i -g pnpm
来安装的,所以才会掉入我们说的这个坑。
但 pnpm 也提供了 brew install pnpm
的方案,这样安装的 pnpm 是全局唯一的。
如何以项目维度隔离不同环境需要?
fnm 可以完美做到在你的项目环境里始终指定你需要的 node 版本。解决步骤如下:
在你的项目目录内新建一个 .node-version 文件,可以用如下命令生成
node -v > .node-version
在你的 bash / shell 脚本里添加如下 eval 指令
eval "$(fnm env --use-on-cd)"
这样每次命令行启动时都会遵循你当前目录的 .node-version
定义。
这样你就可以在不同的项目中有不同的 “环境 + 包管理工具” 组合了。