You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

执行rubocopbundle 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环境容易产生冲突,建议切换到项目本地安装:

  1. 卸载全局的Rubocop:
    rvm @global do gem uninstall rubocop
    
  2. 在项目中添加并安装:
    bundle add rubocop
    
  3. bundle exec rubocop执行,确保使用项目内的依赖版本。

4. 清理缓存文件

缓存损坏也可能引发这类异常,尝试清理相关缓存:

  • 清理Bundler的缓存:
    bundle clean --force
    
  • 清理Rubocop的缓存(如果无法执行rubocop --cache-clear,手动删除~/.cache/rubocop目录)
  • 重新执行bundle install后测试。

备注:内容来源于stack exchange,提问作者Michael Toth

火山引擎 最新活动