Visit_Psych_Nodes_Alias:未知别名:默认(Psych::BadAlias)

use*_*745 88 ruby ruby-on-rails

我从 ruby​​ 2.7.1 更新到 3.1.1,然后删除 Gemfile.lock 并运行bundle update(它位于开发分支上,所以如果这是一个坏主意,我可以扔掉它,我只是想看看它是否有效)。

bundle update成功了,但是当我启动服务器时:

rails s
=> Booting Puma
=> Rails 7.0.2.2 application starting in development 
=> Run `bin/rails server --help` for more startup options
Exiting
/Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:430:in `visit_Psych_Nodes_Alias': Unknown alias: default (Psych::BadAlias)
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/visitor.rb:30:in `visit'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/visitor.rb:6:in `accept'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:35:in `accept'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:345:in `block in revive_hash'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:343:in `each'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:343:in `each_slice'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:343:in `revive_hash'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:167:in `visit_Psych_Nodes_Mapping'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/visitor.rb:30:in `visit'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/visitor.rb:6:in `accept'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:35:in `accept'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:345:in `block in revive_hash'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:343:in `each'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:343:in `each_slice'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:343:in `revive_hash'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:167:in `visit_Psych_Nodes_Mapping'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/visitor.rb:30:in `visit'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/visitor.rb:6:in `accept'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:35:in `accept'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:318:in `visit_Psych_Nodes_Document'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/visitor.rb:30:in `visit'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/visitor.rb:6:in `accept'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:35:in `accept'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych.rb:335:in `safe_load'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych.rb:370:in `load'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/webpacker-4.3.0/lib/webpacker/env.rb:30:in `available_environments'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/webpacker-4.3.0/lib/webpacker/env.rb:21:in `current'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/webpacker-4.3.0/lib/webpacker/env.rb:15:in `inquire'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/webpacker-4.3.0/lib/webpacker/env.rb:7:in `inquire'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/webpacker-4.3.0/lib/webpacker/instance.rb:11:in `env'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/webpacker-4.3.0/lib/webpacker/instance.rb:18:in `config'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/webpacker-4.3.0/lib/webpacker.rb:34:in `config'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/webpacker-4.3.0/lib/webpacker/railtie.rb:32:in `block in <class:Engine>'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/initializable.rb:32:in `instance_exec'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/initializable.rb:32:in `run'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/initializable.rb:61:in `block in run_initializers'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/tsort.rb:228:in `block in tsort_each'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/tsort.rb:431:in `each_strongly_connected_component_from'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/tsort.rb:349:in `block in each_strongly_connected_component'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/tsort.rb:347:in `each'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/tsort.rb:347:in `call'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/tsort.rb:347:in `each_strongly_connected_component'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/tsort.rb:226:in `tsort_each'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/3.1.0/tsort.rb:205:in `tsort_each'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/initializable.rb:60:in `run_initializers'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/application.rb:372:in `initialize!'
    from /Users/st/rails/hangswith/config/environment.rb:5:in `<main>'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/zeitwerk-2.5.4/lib/zeitwerk/kernel.rb:35:in `require'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:42:in `require_relative'
    from config.ru:3:in `block in <main>'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/rack-2.2.3/lib/rack/builder.rb:116:in `eval'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/rack-2.2.3/lib/rack/builder.rb:116:in `new_from_string'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/rack-2.2.3/lib/rack/builder.rb:105:in `load_file'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/rack-2.2.3/lib/rack/builder.rb:66:in `parse_file'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/rack-2.2.3/lib/rack/server.rb:349:in `build_app_and_options_from_config'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/rack-2.2.3/lib/rack/server.rb:249:in `app'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/rack-2.2.3/lib/rack/server.rb:422:in `wrapped_app'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/commands/server/server_command.rb:76:in `log_to_stdout'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/commands/server/server_command.rb:36:in `start'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/commands/server/server_command.rb:143:in `block in perform'
    from <internal:kernel>:90:in `tap'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/commands/server/server_command.rb:134:in `perform'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/thor-1.2.1/lib/thor/command.rb:27:in `run'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/thor-1.2.1/lib/thor/invocation.rb:127:in `invoke_command'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/thor-1.2.1/lib/thor.rb:392:in `dispatch'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/command/base.rb:87:in `perform'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/command.rb:48:in `invoke'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/railties-7.0.2.2/lib/rails/commands.rb:18:in `<main>'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    from /Users/st/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    from bin/rails:4:in `<main>'
Run Code Online (Sandbox Code Playgroud)

我尝试过的

谷歌搜索“psych”错误消息揭示了可能是相关的。但是当我搜索整个应用程序YAML.safe_load(甚至只是safe_load)时,它出现了 0 次。(也许我应该在我的应用程序中搜索实际的宝石?)。

这是一个漫长的过程,但基于这个评论,我跑去gem rdoc --all更新所有的 rdoc 文档。但这没有帮助。

Dan*_*nyB 151

该问题与本期中描述的 Ruby 3.1 / Psych 4.x 不兼容有关: https: //bugs.ruby-lang.org/issues/17866

\n

Ruby 3.0 附带 Psych 3,而 Ruby 3.1 附带 Psych 4,后者有重大突破性更改 ( diff 3.3.2 \xe2\x86\x92 4.0.0 )。

\n
    \n
  • 新的 YAML 加载方法 (Psych 4) 不会加载别名,除非它们获取参数aliases: true
  • \n
  • 旧的 YAML 加载方法(Psych 3)不支持该aliases关键字。
  • \n
\n

此时,似乎任何人、任何地方想要以 Ruby 3.1 之前的方式加载 YAML,都需要执行以下操作:

\n
begin\n  YAML.load(source, aliases: true, **options)\nrescue ArgumentError\n  YAML.load(source, **options)\nend\n
Run Code Online (Sandbox Code Playgroud)\n

由 Rails 团队修补

\n

对于您的情况,我怀疑您需要先查看与您的主要版本首选项匹配的 Rails 版本是否包含此补丁,然后才能升级到 Ruby 3.1。

\n

就我个人而言,只要我能控制加载 YAML 的代码,我就会添加如下扩展:

\n
module YAML\n  def self.properly_load_file(path)\n    YAML.load_file path, aliases: true\n  rescue ArgumentError\n    YAML.load_file path\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n

或者,如果我想完全恢复 Psych 4 中所做的更改,我会将其添加到我的代码中:

\n
module YAML\n  class << self\n    alias_method :load, :unsafe_load if YAML.respond_to? :unsafe_load\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n

这样做的好处是可以将YAML::load, 和YAML::load_file(使用它)恢复到原来的辉煌,并解决所有 Ruby 版本中的所有问题,包括您无法控制的库。

\n

最后,正如我在评论中提到的,如果您更喜欢微创权宜之计,您可以将 Psych 固定到< 4Gemfile 中:

\n
gem \'psych\', \'< 4\'\n
Run Code Online (Sandbox Code Playgroud)\n

Rails 用户注意事项 (>= 7.0.3.1)

\n

ActiveRecord 7.0.3.1更改了内部调用,现在直接调用safe_load。如果您在 Rails 测试期间看到 Psych 相关错误,您可能会受到此更改的影响。

\n

要解决此问题,您可以将其添加到新的或现有的初始值设定项中:

\n
# config/initializers/activerecord_yaml.rb\nActiveRecord.use_yaml_unsafe_load = true\n
Run Code Online (Sandbox Code Playgroud)\n

您也可以用来ActiveRecord.yaml_column_permitted_classes配置允许的类。

\n

更多信息请参阅这篇文章

\n

  • 最后一点:如果需要 Ruby 3.1,您可以在 Gemfile 中固定 `gem 'psych', '&lt; 4'`,除非其他 gem 需要 `&gt;= 4`,否则它可能会工作。 (10认同)
  • 感谢您的精彩解释!不幸的是,我使用的是rails 7.0.2.2,这是最新版本,至少根据[rubygems](https://rubygems.org/gems/rails/versions)。我想知道是否有办法获得更新的版本? (2认同)

小智 25

我遇到了同样的问题,使用最新版本的 Rails 和 ruby​​ 3.1.1 以及 DannyB 提到的建议解决了我的问题。

在我的 Gemfile 中,我放置了 webpacker3 并指定 psych < 4。我还不知道这个版本的 psych 是否会破坏某些东西,但至少安装了 webpacker:

gem 'webpacker', '~>3.0'

gem '心灵', '< 4'


lac*_*der 12

就我而言,ruby version 3.0.3gem 'rails', '~> 6.1.5' 的默认系统版本被锁定psych (default: 3.3.2),但不知何故 Gemfile.lock 的内容被破坏了:

psych (4.0.3)
  stringio

sdoc (2.3.1)
rdoc (>= 5.0, < 6.4.0)
Run Code Online (Sandbox Code Playgroud)

解决方案是删除这些内容,然后在 Gemfile 中锁定 Psych 的正确版本

gem 'psych', '< 4
Run Code Online (Sandbox Code Playgroud)

然后bundle install修复了循环损坏的依赖关系


use*_*745 7

一个简单的解决方案:降级到 ruby​​ 3.0.X

这很简单,不需要更改代码,并且可以在不久的将来升级到 ruby​​ 3.1.x,当一切都赶上并与 Psych 4 兼容时。

注意:ruby 3.0.3 是最新的 ruby​​ 版本,仍然使用 Psych 3.xx,因此没有任何问题,一切正常。

为什么采用这个解决方案?

我更喜欢这个选项,因为修补应用程序或其宝石可能会变得复杂,而我更喜欢最简单/最安全的解决方案。

请参阅此处此处以获取帮助我做出决定的建议:

我认为最好恢复到 ruby​​ 3.0.3,以便使用不使用 psych 4 的最新 ruby​​ 版本。您认为这是一个好主意吗?

绝对是的,关于恢复到 Ruby < 3.1 ...宝石开发者社区更新他们的宝石需要时间

为什么不降低心理等级呢?

我没有将 psych gem 降级为 ruby​​ 的唯一原因是因为我不能 100% 确定这样做不会在其他地方造成问题,可能会导致难以检测的问题。尽管它可能是一个完全可行的解决方案(我只是不确定它是不是,因此我更喜欢安全起见并降级 ruby​​)。

  • 2022 年 11 月。出现错误,因此尚未修复。正在使用 Ruby 3.1.2,但降级以消除错误。我无法编译 ruby​​ 3.0.3 或 3.0.4,所以我运行 3.0.2 (2认同)