Rails项目中bootsnap的kernel_require运行失败是什么原因?
报错诱因
核心原因是你使用的bootsnap 1.3.2版本与Ruby 2.7.x不兼容:
Ruby 2.7对Kernel#require的返回值逻辑做了破坏性调整,此前版本require成功返回布尔值true,2.7及以上版本require成功会返回加载文件的路径字符串。而bootsnap 1.3.2发布早于Ruby 2.7正式版,代码中默认将require的返回值按整型/布尔型处理,拿到字符串类型返回值后做类型强转失败,就触发了你看到的no implicit conversion of String into Integer类型错误。
少数情况也可能是bootsnap本地缓存文件损坏,也会触发同类类型错误。
解决方案
- 升级bootsnap到兼容版本:将Gemfile中bootsnap的版本约束调整到
>= 1.4.6(该版本正式适配Ruby 2.7的返回值变更),执行bundle update bootsnap完成升级后重启应用即可 - 临时禁用bootsnap:若暂时无法升级依赖,打开项目
config/boot.rb,注释掉require 'bootsnap/setup'一行,即可绕开bootsnap逻辑正常启动应用 - 清除损坏缓存:如果升级版本后仍有报错,执行
rm -rf tmp/cache/bootsnap*删除本地缓存文件,再重启应用即可
内容的提问来源于stack exchange,提问作者Petros Kalafatidis
相关产品推荐
相关产品推荐

