各个编程语言都有多版本管理工具,从一开始的能用,到现在的追求快速,好用,也经历了很多代的发展。光我试过的就有nvm、asdf、fnm、volta。目前最火的是volta,我就粗略翻了一下它的源代码看看它是怎么管理的
1 | curl https://get.volta.sh | bash |
它会自动的将以下内容增加到bash
1 | export VOLTA_HOME="$HOME/.volta" |
执行ls -alh $VOLTA_HOME/bin
可以看到node,npm,npx,pnpm,yarn,yarnpkg均被指向了$HOME/.volta/volta-shim
文件
查看volta-shim的执行逻辑,主要是找到对应的需要的工具版本(package.json -> default -> system),然后找到安装的可执行文件执行即可
执行它 VOLTA_LOGLEVEL=debug node
可以看到类似输出
1 | [verbose] Found default configuration at '/Users/ficapy/.volta/tools/user/platform.json' |
可以看到node版本来自于project配置(即package.json)
这个slim比较有意思的是完全劫持了node,npm…etc这些命令行的访问,和其它方案,比如python的多版本管理(一般需要在shell里面添加一些脚本,每次当目录变换的时候执行一下环境检查,如果检查到新环境,就调用source .venv/bin/activate.fish
)侵入性更强,但是用户更加无感知