在 macOS 上做开发或折腾工具链时,最常见的痛点不是“装不装得上”,而是“版本怎么共存、怎么切换、怎么在不同项目里保持一致”。Node、Python、Ruby 这类运行时,如果分别用 nvm/pyenv/rbenv 管,规则各不相同,团队协作也容易踩坑。
asdf 的思路是:用一套命令 + 一个 .tool-versions 文件,把项目所需版本固定下来。你可以把它理解为“多语言的版本管理总控台”。
官方站点:https://asdf-vm.com/
GitHub:https://github.com/asdf-vm/asdf
推荐用 Homebrew 安装(系统已装 Homebrew 的前提下):
brew install asdf
安装完成后,需要让 shell 在每次启动时加载 asdf。不同 shell 配置略有差异,思路都是把 asdf 的初始化脚本加到你的配置文件里。
常见做法(以 zsh 为例,路径以你的机器实际为准):
echo " . $(brew --prefix asdf)/libexec/asdf.sh" >> ~/.zshrc
然后重开终端,或手动加载一次:
source ~/.zshrc
验证是否可用:
asdf --version
asdf 通过“插件”支持不同语言。以 Node 为例:
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
列出可安装版本并安装一个 LTS(示例):
asdf list all nodejs
asdf install nodejs 20.11.1
设置全局默认版本:
asdf global nodejs 20.11.1
或在项目目录设置本项目版本(更推荐):
asdf local nodejs 20.11.1
它会在当前目录写入 .tool-versions,以后进入该目录就自动切换。
Python / Ruby 的流程类似(插件地址与可用版本以官方/插件文档为准):
asdf plugin add python
asdf plugin add ruby
.tool-versions 是 asdf 的核心文件之一,你可以把它提交到仓库,让团队成员在同一个项目里用同一套版本。例如:
nodejs 20.11.1
python 3.12.2
ruby 3.3.0
当你 git clone 项目后,只要装好 asdf 并执行对应语言的 asdf install,就能尽量复刻同样的运行环境。
查看已安装版本:
asdf list nodejs
查看当前生效版本(以及来自 global/local 的来源):
asdf current
更新插件版本列表:
asdf plugin update --all
重新生成 shim(遇到命令找不到时常用):
asdf reshim
1) 终端里 asdf 有,但打开新窗口就没了:多半是 shell 初始化文件没正确加载。
2) 已安装版本却提示找不到命令:先确认 asdf current 是否切到正确版本,再尝试 asdf reshim。
3) 项目里版本不生效:检查项目根目录是否存在 .tool-versions,以及当前工作目录是否正确(有时在子目录里会找不到)。
如果你经常在多个项目间切换、或者团队需要固定版本,asdf 会明显省心;如果你只维护一个项目、语言也很单一,用系统自带或单一工具也没问题。关键是把“版本一致性”当成工程的一部分,而不是靠记忆。