Railsで「warning: already initialized constant Net::ProtocRetryError」を消す
Railsコマンドを実行した際に、
warning: already initialized constant Net::ProtocRetryError
的なログが何行かでてきたので、そちらの対処法をメモ。
実際のログは以下
xx/.rbenv/versions/2.7.6/lib/ruby/2.7.0/net/protocol.rb:66: warning: already initialized constant Net::ProtocRetryError
xxx/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:68: warning: previous definition of ProtocRetryError was here
xxx/.rbenv/versions/2.7.6/lib/ruby/2.7.0/net/protocol.rb:206: warning: already initialized constant Net::BufferedIO::BUFSIZE
xxx/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:214: warning: previous definition of BUFSIZE was here
xxx/.rbenv/versions/2.7.6/lib/ruby/2.7.0/net/protocol.rb:503: warning: already initialized constant Net::NetPrivate::Socket
xxx/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:541: warning: previous definition of Socket was here
環境
PC: Mac(M1Pro)
OS: Ventura 13.0
ruby -v
# => ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [arm64-darwin22]
rails -v
# => Rails 6.0.6.1
rbnv -v
# => rbenv 1.2.0
対処法
こちらのissueのコメントの通りに実行するとできた。
結論
Gemfile
に以下を追加してbundle
gem 'net-http'
Deeplで和訳すると以下
私が考えるに、ここでの適切な修正方法は、faraday-net_http gemがnet-http gemを依存関係として宣言することでしょう。
これは、何が起こっているのかを説明するものです。
faraday-net_http gem が要求されると、次に net/http が要求されます。
bundler は net-http が gem の依存関係であることを知らないので、gem 化されたバージョンを $LOAD_PATH に追加しません。
そして、net/http の stdlib 版は相対的に net/protocol を要求します。これは、これらの gem が gem 化される前はそうであったからです。ruby/net-http@6da598e を参照してください。そのため、net/protocol の stdlib バージョンがロードされる。
net-imapが必要になったとき、net-protocolも使われますが、今回はgem化されたnet-protocolが使われます。net-imapは依存関係として適切に宣言しているので、bundlerはそれを知っていて$LOAD_PATHに置いているのです。これが net/protocol の二重読み込みの原因です。
faraday-net_httpが明示的にnet-httpを依存関係として宣言していれば、関係するすべてのgemのgem化されたバージョンが一貫してロードされ、再定義の警告は発生しなくなります。
faraday-net_httpにこのアップデートを提案し、その間にGemfileにgem "net-http "を追加することで、この問題を回避することをお勧めします。
www.DeepL.com/Translator(無料版)で翻訳しました。
よわよわエンジニアの私は、あんまり理解できていなかったので、文章の細かい意味までは理解できなかった ><
よくわからないが、bunlder側がnet-httpの依存関係を知らない(stdlib版はgem化される前は別プロトコルを使ってたから??)ので、明示的に追加してあげるよっぽい。知らんけど。
よくわからないが、
Gemfileにgem "net-http "を追加することで、この問題を回避することをお勧めします。
とあったので、以下のようにgemを追加し、bundle
コマンドでログが出なくなった👏 (めでたし、めでたし??)
gem 'net-http'
Discussion