Rails 6与Ruby 3环境下全新项目执行Rubocop触发栈溢出错误求助
Rails 6与Ruby 3环境下全新项目执行Rubocop触发栈溢出错误求助
问题背景
我在全新创建的Rails项目中遇到了Rubocop执行报错的问题,环境信息如下:
- Rails版本:6.1.7.7
- Ruby版本:3.0.6p216
- 系统:Apple M2 Pro 运行Sonoma 14.2
- Rubocop安装方式:通过
rvm @global do gem install rubocop全局安装,同时已添加到项目Gemfile
执行rubocop或bundle exec rubocop时均触发栈溢出错误(SystemStackError),错误栈指向Ruby默认库psych的序列化/反序列化环节:
# 直接执行rubocop的错误 /Users/.../.rvm/rubies/ruby-3.0.6/lib/ruby/3.0.0/psych/visitors/to_ruby.rb:128:in `visit_Psych_Nodes_Scalar': stack level too deep (SystemStackError) from /Users/.../.rvm/rubies/ruby-3.0.6/lib/ruby/3.0.0/psych/visitors/visitor.rb:30:in `visit’ # bundle exec rubocop的错误 bundler: failed to load command: rubocop (/Users/.../.rvm/gems/ruby-3.0.6/bin/rubocop) /Users/.../.rvm/rubies/ruby-3.0.6/lib/ruby/3.0.0/psych/visitors/to_ruby.rb:52:in `deserialize': stack level too deep (SystemStackError) from /Users/.../.rvm/rubies/ruby-3.0.6/lib/ruby/3.0.0/psych/visitors/to_ruby.rb:128:in `visit_Psych_Nodes_Scalar'
尝试卸载默认的psych gem失败,提示无法卸载默认gem:
myapp % gem uninstall psych Gem psych-3.3.2 cannot be uninstalled because it is a default gem
我已经排除了代码问题(全新项目无自定义代码),求各位大佬帮忙分析解决!
解决方案建议
这种栈溢出问题通常是依赖版本不兼容或者环境冲突导致的,结合你的环境信息,试试下面几个方向:
1. 匹配Rubocop与Ruby/Rails的兼容版本
Ruby 3.0.x和Rails 6.1.x属于相对旧的版本,最新的Rubocop已经不再对其提供完美支持。建议锁定一个经过验证的稳定版本:
- 如果是全局使用:
rvm @global do gem uninstall rubocop rvm @global do gem install rubocop -v 1.50.0 - 如果是项目本地使用,修改Gemfile:
然后执行gem 'rubocop', '~> 1.50.0'bundle install,再用bundle exec rubocop测试。
2. 升级psych库版本
你遇到的错误栈指向psych的序列化环节,默认的psych 3.3.2在Ruby 3.0.6上可能存在递归解析的bug。虽然无法卸载默认gem,但可以升级到兼容的新版本:
- 执行全局升级:
gem update psych - 或者在项目Gemfile中指定版本:
执行gem 'psych', '~> 4.0.6'bundle install后重新运行Rubocop。
3. 统一使用项目本地的Rubocop
全局安装的gem和项目本地的gem环境容易产生冲突,建议切换到项目本地安装:
- 卸载全局的Rubocop:
rvm @global do gem uninstall rubocop - 在项目中添加并安装:
bundle add rubocop - 用
bundle exec rubocop执行,确保使用项目内的依赖版本。
4. 清理缓存文件
缓存损坏也可能引发这类异常,尝试清理相关缓存:
- 清理Bundler的缓存:
bundle clean --force - 清理Rubocop的缓存(如果无法执行
rubocop --cache-clear,手动删除~/.cache/rubocop目录) - 重新执行
bundle install后测试。
备注:内容来源于stack exchange,提问作者Michael Toth




