vscode配置ruby开发环境需统一版本管理(rbenv/rvm)、插件(wingrunr21.vscode-ruby+ruby-lsp/solargraph)、调试(debug gem)和执行路径(bundle exec),核心是确保vscode终端加载shell配置以对齐ruby环境。

VSCode 本身不管理 Ruby 环境,它只调用你终端里已有的 ruby、bundle 和 gem。如果你看到“command not found”、断点灰掉、跳转失效或 LoadError: cannot load such file,90% 是环境没对齐,不是插件装少了。
which ruby 在 VSCode 终端里输出 /usr/bin/ruby?立刻停手检查 PATH
这说明 VSCode 没加载你的 shell 初始化文件(比如 ~/.zshrc 或 ~/.bash_profile),直接 fallback 到系统 Ruby。macOS 自带的 /usr/bin/ruby 是只读的,gem install 必失败,bundle exec 行为也不一致。
- 在系统终端运行
which ruby和ruby -v,记下结果 - 打开 VSCode 集成终端(
Ctrl+`),再跑一遍which ruby—— 如果路径不同,就是环境隔离了 - 在 VSCode 设置里搜
terminal.integrated.env,按你用的 shell 补全 PATH,例如 zsh 用户加:"terminal.integrated.env.zsh": { "PATH": "/Users/you/.rbenv/shims:/usr/local/bin:$PATH" } - Windows 用户用 msys2 + rbenv,别用 RubyInstaller 自带的 Shell;WSL 装的 Ruby 对原生 VSCode 不可见
装 wingrunr21.vscode-ruby,但必须关掉它的内置 linter
wingrunr21.vscode-ruby 是目前唯一持续维护、支持 Ruby 3.2+ 语法(如 def foo(**opts)、then)的 Ruby 插件。但它默认用 ruby -c 做语法检查,不识别 require_relative 或 autoload_paths,一打开项目就报 LoadError。
- 卸载所有其他 Ruby 扩展:尤其是
rebornix.ruby(已停更)、ruby-solargraph(Solargraph 已停更)、ruby-test(功能被 rspec 插件替代) - 在 VSCode 设置里把
ruby.lint设为空数组:"ruby.lint": []
- 改用
castwide.ruby-lsp(推荐)或手动装solargraph提供语言服务:gem install solargraph,然后在设置里启用ruby.solexperimental并设ruby.solargraph.autoStart为true - 如果项目有
Gemfile,确保solargraph能读到它——它默认只扫描工作区根目录,子目录打开会失效
调试必须用 debug gem,byebug / ruby-debug-ide 全部失效
Ruby 3.1+ 彻底移除了 debugger 方法,byebug 和 ruby-debug-ide 启动即崩溃,错误信息常是 undefined method `write' for nil:NilClass 或断点不命中。
- 在
Gemfile里加:gem "debug", group: :development, require: false
,然后bundle install - 删掉所有
binding.pry和byebug,它们跟debug冲突 -
.vscode/launch.json配置必须满足三点:"type": "ruby"、"request": "launch"、"program"指向可执行脚本(如${workspaceFolder}/bin/rails),不能留ruby-debug-ide相关字段 - 验证
debug是否可用:bundle exec ruby -e "require 'debug'; puts 'ok'",输出ok才算成功
bundle exec 不是建议,是 VSCode 里所有 Ruby 命令的默认前缀
VSCode 插件调用 rubocop、rspec、rails 时,默认走 $PATH 里第一个可执行文件,不是你 Gemfile.lock 锁死的版本。结果就是:终端里 rspec 跑通,VSCode 里点“Run Test”却报 undefined method `allow'(Rspec 2 语法被 Rspec 3 执行了)。
- 在项目根目录的
.vscode/settings.json里强制指定 bundle:{"ruby.lsp.bundlePath":"bundle","ruby.formatting.prettierPath":"bundle exec rufo"} - 不要硬写
"ruby.interpreterPath"指向某个ruby二进制——这会绕过 rbenv 的 shim,导致bundle exec行为异常 - Rails 项目务必在
config/environments/development.rb里设config.autoloader = :classic,:zeitwerk模式对调试器支持不稳定,断点进不了app/models是常见现象
最易被忽略的一点:rbenv 用户每次装新 Ruby 或切版本后,必须运行 rbenv rehash;RVM 用户要 rvm reload。VSCode 不会自动感知这些变化,缓存不清理,which ruby 就永远指向旧路径。











