在 macOS 上做开发,最常见的“环境痛点”是:同一台电脑上同时要维护多个项目,每个项目依赖的运行时版本不同(比如 Node 18/20、Python 3.10/3.12、Java 17/21)。如果只靠手动安装或零散工具,很容易出现版本冲突、PATH 混乱、升级后项目跑不起来等问题。
asdf 的优势在于:用“一套命令 + 插件机制”管理多种语言/工具,并通过项目目录里的 .tool-versions 实现项目级隔离,让你切换目录就能切换版本。
1)安装 asdf:
brew install asdf
2)把 asdf 注入到你的 Shell(以 zsh 为例):
echo ' # asdf . $(brew --prefix asdf)/libexec/asdf.sh' >> ~/.zshrc
3)重新加载配置:
source ~/.zshrc
验证是否安装成功:
asdf --version
- plugin:某种语言/工具的适配器(比如 nodejs、python、java)。
- install:下载安装到本机(可多版本共存)。
- global:设置全局默认版本(对所有目录生效,除非被 local 覆盖)。
- local:在当前项目目录生成/更新 .tool-versions,实现项目级版本固定。
1)添加 Node.js 插件:
asdf plugin add nodejs
2)列出可安装版本(也可直接安装指定版本):
asdf list all nodejs
3)安装并设置全局版本:
asdf install nodejs 20.11.1
asdf global nodejs 20.11.1
4)在某个项目里固定版本(进入项目目录后执行):
asdf local nodejs 18.20.2
此时项目根目录会出现 .tool-versions,团队协作时把它提交到仓库,就能让所有人保持一致版本。
1)添加 Python 插件:
asdf plugin add python
2)安装并设置项目版本:
asdf install python 3.12.2
asdf local python 3.12.2
3)建议搭配虚拟环境使用(示例,按需选择):
python -m venv .venv
source .venv/bin/activate
这样做的好处是:asdf 负责“解释器版本”,venv 负责“依赖隔离”,两者职责清晰。
1)添加 Java 插件:
asdf plugin add java
2)查看可安装版本并安装:
asdf list all java
asdf install java temurin-21.0.2+13
3)在项目目录固定 Java 版本:
asdf local java temurin-21.0.2+13
如果你同时在维护旧项目(Java 17)和新项目(Java 21),这种“目录级切换”会非常省心。
1)把 .tool-versions 当成“环境锁文件”:
- 它记录了每种工具的版本;
- 建议提交到 Git;
- 新成员只要执行 asdf install 就能按清单补齐环境。
2)为项目写一条初始化命令(可写进 README):
asdf install
3)如果你经常在多个项目间切换,建议养成“进入项目先看版本”的习惯:
cat .tool-versions
1)命令找不到(command not found):优先检查 Shell 是否正确加载 asdf 脚本,以及 PATH 顺序。
2)装完版本仍然不是预期版本:执行一次重建 shim:
asdf reshim
3)某些插件下载慢:可考虑更换网络环境或使用镜像源(只做合规加速,不涉及任何绕过/破解)。
4)项目里依赖的版本太旧:不要直接升级系统环境,先在项目目录用 asdf local 固定旧版本,等项目升级后再统一调整。
asdf 官网:https://asdf-vm.com/
asdf GitHub:https://github.com/asdf-vm/asdf