升级Ubuntu22.04后Jekyll3.9.0报Hash无法隐式转Integer错误
问题原因
升级到Ubuntu 22.04后系统默认自带Ruby 3.0及以上版本,使用的Jekyll 3.9.0依赖的pathutil 0.16.2组件和新版Ruby存在兼容性问题。Ruby 3.0收紧了File.read方法的参数校验规则,旧版pathutil调用该方法时把Hash类型的配置作为第二个位置参数传入,但Ruby 3.0要求这个位置必须传入Integer类型的长度值,因此抛出no implicit conversion of Hash into Integer的类型错误。
可用修复方法
- 快速临时修复:直接修改本地pathutil代码
按照报错提示的路径找到/var/lib/gems/3.0.0/gems/pathutil-0.16.2/lib/pathutil.rb文件,定位到第502行的read方法,把原代码里的File.read(path, opts)修改为File.read(path, **opts),也就是给opts参数前加两个星号,把Hash类型参数拆成关键字参数传入即可。修改保存后重新执行bundle exec jekyll serve就能正常启动服务。 - 长期稳定方案:升级Jekyll到4.x版本
Jekyll 4.0及以上版本已经完成Ruby 3.0+的适配,不存在该兼容性问题。如果项目没有强依赖Jekyll 3.x的特殊逻辑,可以直接升级:- 打开项目根目录下的
Gemfile文件,把Jekyll的版本配置修改为gem "jekyll", "~> 4.3" - 在项目目录执行
bundle update jekyll拉取新版依赖 - 重新运行启动命令即可
- 打开项目根目录下的
- 版本锁定方案:降级Ruby到2.7版本
如果项目必须使用Jekyll 3.9.0无法升级,可以通过rbenv、rvm这类Ruby版本管理工具安装Ruby 2.7.x(该版本是Jekyll 3.9官方兼容的最高Ruby版本),切换到2.7版本后重新执行bundle install安装对应版本的依赖,之后启动服务就不会触发报错。
注意:如果使用第一种临时补丁方案,后续重新安装gem包可能会覆盖修改过的文件,需要重新打补丁。
内容的提问来源于stack exchange,提问作者Markus Schmidberger
相关产品推荐
相关产品推荐

