Asdf 版本管理器:一个工具搞定所有语言版本

概述

你是不是也经历过这种场面:Python 用 pyenv,Node.js 用 nvm,Ruby 用 rbenv,Go 用 gvm……每个语言一个版本管理器,配置文件散落各处,换台机器就得重新配一遍。

asdf 是近年冒出来的版本管理器,一个工具管所有语言。它的插件生态很丰富,Python、Node.js、Go、Rust、Elixir、Erlang、Java、PHP、Ruby、Deno、Bun、Terraform、Kubectl 等都有官方插件。装好 asdf 之后,所有语言版本的切换、安装、删除都在同一个命令体系下。

这篇教程带你从零装好 asdf,配上国内镜像,跑通第一个项目。

准备工作

  • 一台能正常联网的 Linux VPS 或本地 Linux 机器
  • Ubuntu 22.04+ / Debian 12+ 推荐,CentOS 8+ 也行
  • root 权限或 sudo 权限
  • 磁盘剩余空间 200MB 以上
  • Git 已安装(asdf 依赖 Git 来拉取插件)

步骤

第一步:安装依赖和 Asdf

先装 asdf 需要的系统依赖:

sudo apt update
sudo apt install -y curl git wget tar ca-certificates xz-utils

然后用官方脚本安装 asdf:

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

装完之后把 asdf 加入 shell 配置。打开 ~/.bashrc:

echo '. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo '. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc

如果你用 zsh,把上面两行加到 ~/.zshrc。

让配置立即生效:

source ~/.bashrc

第二步:验证安装

asdf version

正常输出类似 0.14.1-4d9f3ac。如果提示 command not found,确认 .bashrc 里的两行配置已经生效。

第三步:安装第一个语言插件

以 Python 为例,先加插件:

asdf plugin add python

查看 available 的 Python 版本:

asdf list-all python

选一个版本安装,比如最新稳定版 3.12.7:

asdf install python 3.12.7

安装完成后设置全局默认版本:

asdf global python 3.12.7

验证:

python --version
# 输出 Python 3.12.7

第四步:安装其他语言插件

asdf 的插件都统一用 asdf plugin add 安装。常见语言:

# Node.js
asdf plugin add nodejs
asdf list-all nodejs | tail -5
asdf install nodejs 22.11.0
asdf global nodejs 22.11.0

# Go
asdf plugin add golang
asdf install golang 1.23.2
asdf global golang 1.23.2

# Rust
asdf plugin add rust
asdf install rust 1.82.0
asdf global rust 1.82.0

# Deno
asdf plugin add deno
asdf install deno 2.1.3
asdf global deno 2.1.3

# Bun
asdf plugin add bun
asdf install bun 1.2.15
asdf global bun 1.2.15

每个插件安装完都记得用 asdf global <语言> <版本> 设置全局默认。

第五步:项目级版本管理

asdf 最厉害的地方是项目级版本控制。在项目根目录放一个 .tool-versions 文件:

python 3.12.7
nodejs 22.11.0
golang 1.23.2

以后 cd 进这个目录,asdf 会自动切换成对应的版本。不用手动切换,不怕搞混。

第六步:国内镜像加速(重要)

很多语言版本的源码下载在海外,国内直接装会很慢。需要配镜像。

Python:在 ~/.asdf/pyenv/plugins/python-build/share/python-build 所在目录,或者提前下载好 Python 源码包放 ~/.asdf/downloads/python/ 下。更简单的方式是用镜像源安装:

# 用清华源下载 Python 源码包
mkdir -p ~/.asdf/downloads/python/
cd ~/.asdf/downloads/python/
wget https://mirrors.tuna.tsinghua.edu.cn/python/3.12.7/Python-3.12.7.tgz
# 然后 asdf 会从缓存目录读取,不走网络
asdf install python 3.12.7

Node.js:用 nvm 的淘宝镜像方式,在 asdf 的 Node.js 插件里配:

export NODE_BUILD_DOWNLOAD_TOKEN=$(echo YWRtaW46 | base64)
# 或者直接用镜像 URL
export NODEJS_VERSION_URL=https://registry.npmmirror.com/-/binary/node
asdf install nodejs 22.11.0

更简单的方式是在 .bashrc 里加:

export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node

Go:

export GOPROXY=https://goproxy.cn,direct
export GONOSUMCHECK=*
export GONOSUMDB=*
export GOFLAGS=-insecure

Rust:

export RUSTUP_DIST_SERVER=https://rsproxy.cn
export RUSTUP_UPDATE_ROOT=https://rsproxy.cn/rustup

把这些 export 加到 ~/.bashrc 里,每次登录自动生效。

验证

全部装好后跑这几个检查:

# 1. asdf 版本
asdf version

# 2. 所有已安装的语言
asdf list

# 3. 各语言版本
python --version
node --version
go version
rustc --version
deno --version

# 4. 查看当前项目版本文件
cat .tool-versions 2>/dev/null || echo "当前目录没有 .tool-versions 文件"

四项都通过,asdf 环境就配好了。

常用命令速查

# 添加插件
asdf plugin add <语言>

# 查看可用版本
asdf list-all <语言>

# 安装版本
asdf install <语言> <版本>

# 设为全局默认
asdf global <语言> <版本>

# 设为当前目录默认(写到 .tool-versions)
asdf local <语言> <版本>

# 查看已安装版本
asdf list <语言>

# 卸载版本
asdf uninstall <语言> <版本>

# 删除插件
asdf plugin remove <语言>

# 更新 asdf 本身
asdf update

# 更新所有插件到最新版本
asdf plugin update --all

# 查看所有已安装插件
asdf plugin list

常见问题

安装 Python 时报"download failed"?

源码下载地址在海外。手动下载源码包放到缓存目录:

mkdir -p ~/.asdf/downloads/python/
cd ~/.asdf/downloads/python/
wget https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tgz
# 再跑安装,asdf 会优先用缓存
asdf install python 3.12.7

asdf: command not found?

shell 配置没生效。确认 .bashrc 里有这两行:

echo '. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo '. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
source ~/.bashrc

新开一个终端窗口后asdf命令才能生效。

切换版本后 python 还是旧版?

可能装了多个 Python。用 which 确认:

which python
# 应该输出 ~/.asdf/shims/python

如果不是 shims 路径,说明 asdf 没正确接管。检查 PATH 顺序,asdf 的 shims 目录要在最前面:

export PATH="$HOME/.asdf/shims:$PATH"

插件找不到或者安装失败?

有些插件不在 asdf 官方仓库里,需要用完整 URL:

asdf plugin add <语言> https://github.com/<作者>/asdf-<语言>.git

去 asdf-plugins 搜索插件地址。

换机器后要重装吗?

不需要。把 .tool-versions 文件和 asdf 配置一起备份到新机器,然后:

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1
# 加入 .bashrc
# 然后批量安装所有语言
asdf plugin add python && asdf install python $(awk '$1=="python"{print $2}' .tool-versions)
asdf plugin add nodejs && asdf install nodejs $(awk '$1=="nodejs"{print $2}' .tool-versions)

一行搞定,不用逐个配。

asdf 和 nvm/pyenv 能共存吗?

能,但不推荐。两个管理器会互相抢 PATH,版本切换容易乱。建议统一用 asdf,把 nvm/pyenv 卸掉:

# 卸载 nvm
rm -rf ~/.nvm
# 卸载 pyenv
rm -rf ~/.pyenv

然后把对应的语言切换到 asdf 管理即可。

这篇文章对你有帮助吗?