apt 的 Ruby 和 rbenv 共存容易造成 gem、bundle 路径混乱,建议先卸载:
# 卸载所有 gem
gem uninstall -aIx
# 卸载 ruby-full
sudo apt-get purge ruby-full
# 删除本地用户 gem 目录(用 gem env 查询实际路径,别硬编码)
rm -rf "$(gem env user_gem_dir)"
Ubuntu 的 apt 源里 rbenv 版本陈旧,官方推荐用 git clone 安装:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
# 配置 PATH,让 rbenv 可执行
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
# 初始化 rbenv:加载 shims 和补全
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
注意:
rbenv init只是打印配置提示,真正生效的是写入~/.bashrc的eval "$(rbenv init -)",这行必须加,否则重开终端后 rbenv 失效。
ruby-build 负责从源码编译 Ruby,以插件形式安装:
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
# 后续升级
git -C "$(rbenv root)"/plugins/ruby-build pull
rbenv install 是从源码编译,缺少依赖会直接报错:
sudo apt install build-essential libssl-dev libyaml-dev libreadline-dev zlib1g-dev
rbenv install -l # 列出可安装的所有版本,选最新的稳定版
rbenv install 3.3.0
如果编译报错,优先检查上面的依赖是否装全。
rbenv versions # 查看所有已安装版本
rbenv version # 查看当前生效版本
rbenv global 3.3.0 # 全局默认版本
rbenv local 3.3.0 # 当前目录指定版本(生成 .ruby-version 文件)
rbenv shell 3.3.0 # 仅当前 shell 生效(临时)
优先级:shell > local > global。rbenv local 会在目录生成 .ruby-version 文件,进入该目录时自动切换到对应版本,所以 rbenv local 指定的版本必须先 rbenv install 好。
which ruby
# 应输出 /home/sj/.rbenv/shims/ruby,在 shims 目录下就说明 rbenv 接管成功
rbenv 通过 shims 机制拦截 ruby、gem、bundle 等命令,再按当前目录的版本规则转发到实际安装的 Ruby。
rbenv rehash(新版 rbenv 安装 Ruby 时已自动执行,一般无需手动)rbenv local 2.7.5 报错:该版本未安装,先 rbenv install 2.7.5which ruby 仍指向 /usr/bin/ruby:检查 ~/.bashrc 中 PATH 设置是否生效,或确认 apt 的 ruby 是否卸载干净