VSCode不管理Ruby环境,需通过终端执行code .启动以继承rbenv/rvm环境;调试须用fxn.vscode-ruby-debug插件+debug gem(非byebug),并配置zeitwerk为classic模式、清除tmp缓存。

Ruby版本和gemset怎么选才不踩坑
VSCode本身不管理Ruby环境,它只调用你系统里已有的ruby和bundle。如果你用rbenv或rvm,必须确保终端启动VSCode时环境变量已加载——直接双击图标打开通常会丢失GEM_HOME、GEM_PATH,导致bundle install成功但VSCode里rails server报Could not find gem。
- 在终端执行
code .(不是open -a "Visual Studio Code" .)才能继承当前shell的Ruby上下文 - 检查VSCode集成终端是否运行的是同一shell:
echo $SHELL和which ruby要跟你在项目根目录下手动运行的一致 - 别在
.vscode/settings.json里硬写"ruby.interpreterPath"指向某个ruby二进制——这会绕过rbenv的shim机制,导致bundle exec行为异常
Debugger for Ruby插件现在还能用吗
官方rebornix.Ruby插件已停更,目前唯一稳定可用的是fxn.vscode-ruby-debug(基于debug gem)。它不兼容旧版byebug或pry-byebug,必须用debug gem + Ruby 3.1+(或打过debug补丁的2.7/3.0)。
- 在
Gemfile里加gem "debug", group: :development, require: false,然后bundle install - 删掉所有
byebug、pry-byebug相关代码,包括binding.pry——它们跟debug冲突,会导致断点失效或进程卡死 - VSCode的
launch.json里type必须是ruby,request为launch,program设为${workspaceFolder}/bin/rails,args填["server", "-p", "3000"]
为什么断点进了app/controllers却进不了app/models
常见原因是debug gem默认不监听autoload_paths外的文件,而Rails 7+默认把app/models加入autoload_paths,但VSCode调试器可能没及时识别路径变化。
- 在
config/environments/development.rb里确认有config.autoloader = :classic(Rails 7.0+默认是:zeitwerk,它对调试器支持不稳定) - 重启VSCode调试会话前,先在终端执行
bin/rails tmp:clear,否则zeitwerk缓存会让断点跳转错乱 - 如果仍不行,在
launch.json的env里加"RUBY_DEBUG_NO_RAILS": "1"临时禁用Rails集成,看是否能进模型——能进说明是zeitwerkautoload干扰
VSCode里运行rake任务总提示Don't know how to build task
不是任务名写错,而是VSCode没加载Rails.env或BUNDLE_GEMFILE。rake命令本身不自动读RAILS_ENV,必须显式传参;同时bundle exec rake依赖GEMFILE环境变量定位Gemfile位置。
- 不要直接在VSCode终端敲
rake db:migrate——改用bundle exec rake db:migrate RAILS_ENV=development - 在
.vscode/tasks.json里定义task时,command字段必须是bundle,args设为["exec", "rake", "db:migrate", "RAILS_ENV=development"] - 如果项目用了
spring,调试时建议关掉它:export DISABLE_SPRING=1再启动调试,否则spring预加载会掩盖真实require错误
最麻烦的其实是zeitwerk autoload和debug gem的耦合问题——它不报错,但断点会随机消失,这时候得看debug gem的日志输出,而不是盲目重装插件。


















