【问题标题】:visit_Psych_Nodes_Alias: Unknown alias: default (Psych::BadAlias)visit_Psych_Nodes_Alias:未知别名:默认(Psych::BadAlias)
【发布时间】:2022-06-19 21:16:34
【问题描述】:

我从 ruby​​ 2.7.1 更新到 3.1.1,然后删除 Gemfile.lock 并运行 bundle update(它在 dev 分支上,所以如果这是一个坏主意,我可以把它扔掉,我只是想看看如果可以的话)。

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>'

我尝试过的

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

这是一个很长的镜头,但基于this 的评论,我ran gem rdoc --all 来更新所有 rdoc 文档。但这没有帮助。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

    Ruby 3.0 附带 Psych 3,而 Ruby 3.1 附带 Psych 4,它有一个重大的重大变化 (diff 3.3.2 → 4.0.0)。

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

    在这一点上,似乎任何地方的任何人想要以与 Ruby 3.1 之前相同的方式加载 YAML,都需要执行以下操作:

    begin
      YAML.load(source, aliases: true, **options)
    rescue ArgumentError
      YAML.load(source, **options)
    end
    

    as patched by the Rails team.

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

    就我个人而言,无论我在哪里控制加载 YAML 的代码,我都会添加这样的扩展:

    module YAML
      def self.properly_load_file(path)
        YAML.load_file path, aliases: true
      rescue ArgumentError
        YAML.load_file path
      end
    end
    

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

    module YAML
      class << self
        alias_method :load, :unsafe_load if YAML.respond_to? :unsafe_load
      end
    end
    

    这具有将YAML::load 和YAML::load_file(使用它)恢复到原来的荣耀的优点,并解决了所有Ruby 版本中的所有问题,包括您无法控制的库。

    最后,正如我在 cmets 中提到的,如果您更喜欢微创的权宜之计,您可以在 Gemfile 中将 Psych 固定到 &lt; 4 上:

    gem 'psych', '< 4'
    

    我希望在 Ruby 3.1.x / Psych 中恢复这种行为。

    【讨论】:

    • 感谢您的精彩解释!不幸的是,至少根据rubygems,我使用的是最新版本的rails 7.0.2.2。我想知道是否有办法获得更新的版本?
    • 自从去年 5 月发布了那个补丁,我开始怀疑我是否正在使用某个特定的 gem 不兼容?事后思考:嗯..不太可能,因为所有的宝石都是最新的(因为我跑了bundle update)
    • 那么是的,问题可能出在其他一些 gem 上,根据您的错误日志可能是 webpacker。这是一个令人头疼的重大变化,我相信所有宝石都需要一些时间来解决它。在我看来,Psych 团队在引入此更改时没有正确理解连锁反应。
    • 绝对是关于恢复到 Ruby
    • 最后一点:如果需要 Ruby 3.1,您可以将 gem 'psych', '&lt; 4' 固定在您的 Gemfile 中,除非其他一些 gem 需要 &gt;= 4,否则它可能会起作用。
    【解决方案2】:

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

    在我的 Gemfile 中,我输入了 webpacker3 并指定了 psych

    gem 'webpacker', '~>3.0'

    宝石'心理','

    【讨论】:

    • 感谢这工作。就个人而言,我认为这应该是公认的解决方案,因为修复 ruby​​ 错误不是我们作为 Rails 开发人员的工作。与任何解决方法相比,我更喜欢这个,至少在 Psych 4+ 被修补之前。
    • 在我看来,Psych 4 不太可能恢复到原来的行为。
    【解决方案3】:

    一个简单的解决方案:降级到 ruby​​ 3.0.3

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

    注意:ruby 3.0.3 是最新的 ruby​​ 版本,它仍然使用 Psych 3.x.x,所以没有问题,一切正常。

    为什么是这个解决方案?

    我更喜欢这个选项,因为patching an app or its gems 会变得复杂,我更喜欢最简单/最安全的解决方案。

    请参阅 here 和 here 了解帮助我做出决定的建议:

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

    关于恢复到 Ruby

    为什么不降级心理呢?

    我没有降级 psych gem 而不是 ruby​​ 的唯一原因是因为我不能 100% 确定这样做不会在其他地方引起问题,可能是难以检测到的问题。虽然它可能是一个完全可行的解决方案(我只是不确定它是否可行,因此我更喜欢安全地使用它并降级 ruby​​)。

    【讨论】:

    • 嗯,这是权宜之计。最终,您将需要升级。
    • @DannyB 肯定 ? 正如您在上面的回答中解释的那样,宝石最终会赶上来。我会给它 6 个月再试一次 :) (我写这个答案只是为了确保人们意识到如果他们愿意暂时推出 ruby​​ 3.0.3 有一个简单的解决方法)
    【解决方案4】:

    就我而言,我在gem 'rails', '~&gt; 6.1.5' 上有ruby version 3.0.3 我的默认系统版本被锁定为psych (default: 3.3.2),但不知怎的 Gemfile.lock 有东西坏了:

    psych (4.0.3)
      stringio
    
    sdoc (2.3.1)
    rdoc (>= 5.0, < 6.4.0)
    

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

    gem 'psych', '< 4
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      相关资源
      最近更新 更多