🚧

Railsで「warning: already initialized constant Net::ProtocRetryError」を消す

2023/02/18に公開

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のコメントの通りに実行するとできた。
https://github.com/ruby/net-imap/issues/16#issuecomment-803086765

結論

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