执行padrino start启动服务器时触发FrozenError报错求助
Padrino启动时FrozenError报错排查与解决
报错信息
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/padrino-core-0.15.1/lib/padrino-core/application.rb:32:in `concat': can't modify frozen Array: [/\\/sinatra(\\/(base|main|show_exceptions))?\\.rb$/, /lib\\/tilt.*\\.rb$/, /^\\(.*\\)$/, /rubygems\\/(custom|core_ext\\/kernel)_require\\.rb$/, /active_support/, /bundler(\\/(?:runtime|inline))?\\.rb/, /<internal:/] (FrozenError)
项目Gemfile配置
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } # Padrino supports Ruby version 2.2.2 and later ruby '2.7.0' # Distribute your app as a gem # gemspec # Server requirements # gem 'thin' # or mongrel # gem 'trinidad', :platform => 'jruby' # Optional JSON codec (faster performance) # gem 'oj' # Project requirements gem 'rake' gem 'bcrypt' gem 'activesupport' # Component requirements gem 'erubi', '~> 1.6' gem 'activerecord', '>= 3.1', :require => 'active_record' gem 'sqlite3' # Test requirements # Padrino Stable Gem gem 'padrino', '0.15.1'
解决方案
原因说明
Padrino 0.15.1版本与Ruby 2.7+环境存在兼容性问题:代码尝试修改Sinatra已冻结的ignore_patterns数组,而Ruby 2.7及以上版本对冻结对象的修改操作做了严格限制,因此抛出FrozenError。
具体解决办法
优先推荐:升级Padrino版本
修改Gemfile中的Padrino版本约束为>= 0.15.2(该版本已修复此兼容性问题):gem 'padrino', '>= 0.15.2'执行命令更新依赖:
bundle update padrino应急方案:修改Padrino源码(不推荐长期使用)
找到报错文件C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/padrino-core-0.15.1/lib/padrino-core/application.rb的第32行,将原有的concat操作改为先复制数组再修改:
原代码:Sinatra::Application.ignore_patterns.concat(IGNORE_PATTERNS)修改为:
Sinatra::Application.ignore_patterns = Sinatra::Application.ignore_patterns.dup.concat(IGNORE_PATTERNS)或等价写法:
Sinatra::Application.ignore_patterns += IGNORE_PATTERNS备选方案:降级Ruby版本
将Ruby版本降至2.6及以下,避开Ruby 2.7+对冻结对象的严格限制,但这是临时退阶方案,不建议长期使用。
内容的提问来源于stack exchange,提问作者aaaa
相关产品推荐
相关产品推荐

