运行rails server或rails s命令出现StringIO超类不匹配TypeError错误
问题根因
你遇到的superclass mismatch for class StringIO (TypeError)是Ubuntu 21.10 自带的 Ruby 2.7.4 与项目中 bootsnap 1.9.1 缓存组件的兼容性问题:系统预装的Ruby环境提前预加载了StringIO类定义,和bootsnap加载YAML依赖时引入的StringIO类父类声明不一致,触发类型冲突。
可执行解决方案
按操作成本从低到高排序:
- 方案1:清除本地bootsnap缓存
在项目根目录执行命令:
执行完成后重新运行rm -rf tmp/cache/bootsnap*rails s即可正常启动,适合首次遇到该问题的场景。 - 方案2:临时禁用bootsnap验证问题
打开项目下的config/boot.rb文件,注释掉require 'bootsnap/setup'这一行,保存后重新启动服务即可。 - 方案3:升级bootsnap版本永久修复兼容性
打开项目根目录的Gemfile文件,将bootsnap的版本声明修改为:
之后执行gem 'bootsnap', '>= 1.10.0'bundle update bootsnap更新依赖包,完成后再启动服务不会再触发该冲突。 - 方案4:Ruby版本管理(长期使用Rails推荐)
Ubuntu系统自带的Ruby版本常和Rails生态依赖存在兼容性问题,建议使用rbenv或rvm工具管理独立的Ruby运行环境,安装非系统源的Ruby 2.7稳定版或更高版本,可规避绝大多数类似的系统包冲突问题。
内容的提问来源于stack exchange,提问作者Happer64Bit
相关产品推荐
相关产品推荐

