将应用程序从 Rails 5 升级到 Rails 7 时的警告

ope*_*per 6 ruby rubygems ruby-on-rails ruby-on-rails-5

最近upgrade to rails 7.0.2 from rails 5.2,当我在开发模式下启动 Rails 控制台或 Rails 服务器时,我会看到这些警告

/Users/opensource/.rvm/gems/ruby-2.7.4/gems/digest-3.1.0/lib/digest.rb:20: warning: already initialized constant Digest::REQUIRE_MUTEX
/Users/opensource/.rvm/rubies/ruby-2.7.4/lib/ruby/2.7.0/digest.rb:6: warning: previous definition of REQUIRE_MUTEX was here
/Users/opensource/.rvm/rubies/ruby-2.7.4/lib/ruby/2.7.0/net/protocol.rb:66: warning: already initialized constant Net::ProtocRetryError
/Users/opensource/.rvm/gems/ruby-2.7.4/gems/net-protocol-0.1.3/lib/net/protocol.rb:68: warning: previous definition of ProtocRetryError was here
/Users/opensource/.rvm/rubies/ruby-2.7.4/lib/ruby/2.7.0/net/protocol.rb:206: warning: already initialized constant Net::BufferedIO::BUFSIZE
/Users/opensource/.rvm/gems/ruby-2.7.4/gems/net-protocol-0.1.3/lib/net/protocol.rb:208: warning: previous definition of BUFSIZE was here
/Users/opensource/.rvm/rubies/ruby-2.7.4/lib/ruby/2.7.0/net/protocol.rb:503: warning: already initialized constant Net::NetPrivate::Socket
/Users/opensource/.rvm/gems/ruby-2.7.4/gems/net-protocol-0.1.3/lib/net/protocol.rb:504: warning: previous definition of Socket was here
/Users/opensource/.rvm/gems/ruby-2.7.4/gems/apipie-rails-0.7.0/lib/apipie/extractor/recorder.rb:163: warning: Skipping set of ruby2_keywords flag for process (method accepts keywords or method
Run Code Online (Sandbox Code Playgroud)

无论如何,警告在应用程序打开时不会出现,Rails 7.0而仅在应用程序升级到Rails 7.0.2

我按照指南升级了导轨

5.2 -> 6.0 -> 6.1 -> 7.0 -> 7.0.2

也许我错过了一些东西,无论如何我可以解决这些问题吗?也许这些会随着 ruby​​/rails 后续升级而消失?

谢谢。

mog*_*777 7

Rails 7.0.1 为标准库添加了一些 gem 依赖项,这些依赖项将在 ruby​​ 3.0 中删除。不幸的是,这会导致 ruby​​ 2.7.6 出现问题。您可以通过多种方式解决这个问题。升级 ruby​​ 也会升级捆绑器,从而解决该问题。在没有 ruby​​ 的情况下升级捆绑器也可以,但我不推荐它(最好指出系统版本)。更保守的解决方法是找到导致问题的 gem,并将它们列在您的Gemfile. 就我而言,我必须确保 gem 版本与默认的 ruby​​ gem 版本相同。例如,我必须使 Gemfile 具有gem "uri", "0.10.0". 调试导致这些问题的一个好方法是将其放在 Gemfile 的顶部:

Warning.module_eval do
  alias_method :original_warn, :warn

  def warn(msg)
    if msg.match?(/already initialized constant/)
      raise msg
    else
      original_warn(msg)
    end
  end
end

Run Code Online (Sandbox Code Playgroud)

这样,您就可以获得需要 stdlib 文件且也存在冲突 ruby​​gem 的位置的堆栈跟踪。


cla*_*ked -1

看起来这些都是依赖代码 gem 中定义的常量。在遇到此问题时,运行 bundle clean --force或更新依赖项bundle update,然后运行​​可以解决某些问题。bundle clean --force