很多人装环境时会遇到同一个问题:公司项目要用旧版本 Node/Python,你自己的新项目又想用最新版;再加上不同项目依赖不同版本,来回切换很容易把全局环境搞乱。asdf 的思路很直接:用“插件”统一管理不同语言/工具的版本,并用一个 .tool-versions 文件把项目需要的版本写清楚,进入目录就按项目版本工作。
工具/参考链接:
https://github.com/asdf-vm/asdf
在 macOS 上最省心的方式是用 Homebrew 安装。安装完成后,需要在 shell 启动文件里做一次初始化,让 asdf 命令与 shims 生效。
1) 安装:
brew install asdf
2) zsh 初始化(常见是写进 ~/.zshrc 或 ~/.zprofile,具体以你的终端加载顺序为准):
echo ' # asdf . $(brew --prefix asdf)/libexec/asdf.sh ' >> ~/.zshrc
3) 让配置立即生效:
source ~/.zshrc
4) 验证:
asdf --version
asdf 的使用套路几乎是固定的:先加插件,再列出可安装版本,然后安装需要的版本,最后选择在全局或项目里启用。
1) 添加插件:
asdf plugin add nodejs
asdf plugin add python
2) 查看可用版本(只看部分,避免列表太长):
asdf list all nodejs | tail -n 20
asdf list all python | tail -n 20
3) 安装指定版本(示例版本可按项目需要替换):
asdf install nodejs 20.11.1
asdf install python 3.11.8
4) 设为全局默认(对所有目录生效):
asdf global nodejs 20.11.1
asdf global python 3.11.8
5) 刷新 shims(遇到“命令找不到”时很有用):
asdf reshim
真正能让团队环境一致的关键,是把版本写进仓库。asdf 会优先读取当前目录(及父目录)里的 .tool-versions,从而在不同项目之间自动切换。
1) 在项目根目录设置本项目版本:
asdf local nodejs 18.19.1
asdf local python 3.10.13
2) 你会得到一个 .tool-versions 文件(示例):
nodejs 18.19.1
python 3.10.13
3) 把它提交到 Git,团队成员拉代码后按文件安装即可:
asdf install
提示:如果你希望“进入项目目录就自动提示缺少版本”,可以在团队约定里写清楚第一次需要执行 asdf install。另外,有些语言插件会依赖系统库(比如 Python 编译依赖),建议把依赖也写进项目 README 的环境准备章节。
1) 明明装了版本,node -v 还是旧的?
先确认当前目录 asdf 选中的版本:
asdf current
再检查 which node 是否指向 asdf 的 shims。如果不是,通常是 shell 初始化没有加载或 PATH 顺序被其他工具(例如 nvm、conda)覆盖。可以临时执行:
source $(brew --prefix asdf)/libexec/asdf.sh
然后重新打开一个新终端验证。
2) 更新/安装后某些命令找不到?
多数情况下执行一次 asdf reshim 就能修复,因为 asdf 通过 shim 代理到具体版本的可执行文件。
3) 团队里有人用 bash,有人用 zsh?
核心是确保都正确初始化 asdf。建议把“初始化片段”作为团队模板写到开发环境文档里,并把版本固定在 .tool-versions,而不是口头约定“大家都装最新版”。
如果你把 asdf 当成“项目环境的一部分”,你会发现它特别适合两类场景:一是多项目并行(不同 Node/Python 版本切换),二是新同事/新电脑快速恢复环境。最推荐的做法是:项目根目录放 .tool-versions,README 里补一段 asdf install 的初始化说明,然后在本地用 asdf local 固定版本,长期维护起来非常省心。