Ruby on Rails服务启动失败:所有rake命令均无法执行
问题解决:devise-jwt与dry-configurable版本不兼容导致启动失败
错误原因
你遇到的问题核心是devise-jwt 0.8.1版本与新版dry-configurable gem不兼容。dry-configurable更新后废弃了原有setting方法的参数格式:
- 不再支持通过位置参数传递默认值,需改用
default:关键字参数 - 不再支持通过块传递构造逻辑,需改用
constructor:关键字参数
这些废弃警告最终引发ArgumentError,导致Rails环境初始化失败。
解决方案
方案1:锁定dry-configurable到兼容版本(最简单)
在项目Gemfile中添加对dry-configurable旧版本的锁定:
gem 'dry-configurable', '~> 0.13.0'
执行命令更新依赖:
bundle update dry-configurable
该版本的dry-configurable仍支持devise-jwt 0.8.1的旧语法,可直接解决问题。
方案2:修改devise-jwt源码适配新语法(临时应急)
若无法修改Gemfile,可直接修改devise-jwt的jwt.rb文件,将所有setting调用替换为新的关键字参数格式:
原代码示例:
setting(:secret, Warden::JWTAuth.config.secret) do |value| forward_to_warden(:secret, value) end
替换为:
setting :secret, default: Warden::JWTAuth.config.secret, constructor: ->(value) { forward_to_warden(:secret, value) }
需对以下所有setting调用做同样修改:
expiration_timedispatch_requestsrevocation_requestsaud_header
方案3:升级devise-jwt到兼容新版dry-configurable的版本
devise-jwt后续版本已适配dry-configurable新语法,可尝试升级到稳定版本,比如:
gem 'devise-jwt', '~> 0.11.0'
执行命令更新:
bundle update devise-jwt
注意:升级前需确认新版本与你的Rails 5.1.2版本兼容,避免引入新冲突。
内容的提问来源于stack exchange,提问作者Wojciech Kowalczyk
相关产品推荐
相关产品推荐

