使用rbenv管理Ruby环境

Posted by songjian on June 17, 2024 · 2 mins read

为什么用 rbenv

  • 系统 apt 自带的 Ruby 版本固定且陈旧,升级麻烦
  • 不同项目可能需要不同 Ruby 版本,rbenv 可以按目录自动切换
  • 安装 gem 不需要 sudo,不会污染系统环境

前置:卸载 apt 安装的 Ruby(可选)

apt 的 Ruby 和 rbenv 共存容易造成 gembundle 路径混乱,建议先卸载:

# 卸载所有 gem
gem uninstall -aIx

# 卸载 ruby-full
sudo apt-get purge ruby-full

# 删除本地用户 gem 目录(用 gem env 查询实际路径,别硬编码)
rm -rf "$(gem env user_gem_dir)"

安装 rbenv

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 只是打印配置提示,真正生效的是写入 ~/.bashrceval "$(rbenv init -)",这行必须加,否则重开终端后 rbenv 失效。

安装 ruby-build 插件

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

安装指定版本 Ruby

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 > globalrbenv local 会在目录生成 .ruby-version 文件,进入该目录时自动切换到对应版本,所以 rbenv local 指定的版本必须先 rbenv install 好。

验证是否生效

which ruby
# 应输出 /home/sj/.rbenv/shims/ruby,在 shims 目录下就说明 rbenv 接管成功

rbenv 通过 shims 机制拦截 rubygembundle 等命令,再按当前目录的版本规则转发到实际安装的 Ruby。

常见问题

  • 新装的 gem 命令找不到:执行 rbenv rehash(新版 rbenv 安装 Ruby 时已自动执行,一般无需手动)
  • rbenv local 2.7.5 报错:该版本未安装,先 rbenv install 2.7.5
  • which ruby 仍指向 /usr/bin/ruby:检查 ~/.bashrc 中 PATH 设置是否生效,或确认 apt 的 ruby 是否卸载干净

ruby