【2つの解決法】rails コマンドのエラーincompatible library version ~~~~~(LoadError)


環境
ruby 2.7.0
Rails 5.2.0

突然rails コマンドが動かなくなりました。

今回ですと常に下記のエラーが付き纏います。

incompatible library version - /Users/shogo/environment/insta-clone/vendor/bundler/ruby/2.6.0/gems/msgpack-1.3.1/lib/msgpack/msgpack.bundle (LoadError)

msgpackかと思い、調べてみたのですがなかなか見つからず。

incompatible library version で検索しても見つからず。

原因:incompatible library version(ライブラリの互換性)

incompatible=互換性という意味になります。

library version=ライブラリのバージョンです。

つまりディレクトリ(現在作業しているアプリ)で使っているrubyのバージョンとgemに互換性がないから

・エラーでてるgemを削除しろ
・またはrubyのバージョン上げろ
・またはrubyのバージョン下げろ

って話。

下記記事をみつつ、バージョンを上げたり下げたりしてみましょう。
https://qiita.com/pipi_taro/items/9c9a6ccc110b159b967b

ローカル環境のrubyを使っている際(つまりエラーでてるアプリにインストールされているrubyとローカル環境で設定しているrubyのバージョンが異なる場合)には、パス指定でうまくいく可能性もありますね。

パス指定する

[[ -d ~/.rbenv  ]] && \
export PATH=${HOME}/.rbenv/bin:${PATH} && \
eval "$(rbenv init -)"

which rubyでパスが変更したか確認する

/Users/shogo/.rbenv/shims/ruby

エラー文にmsgpackと記載してあるのに、原因は互換性の問題らしい。非常にわかりにくい。

原因②:bundle installをする際にパスを指定していない

原因1では解決しなかったので、エラー文をもう一度みると

~vendor/bundler/ruby/2.6.0/gems/msgpack-1.3.1/~

ruby/2.6.0と書いてあります。
実際にアプリ内で使用しているバージョンは2.7.0です。

実際にvendor/bundler/rubyをみてみると、

2.6.0と2.7.0があるわけですね。

とりあえずバージョンがずれているので下記記事をみつつ、bundleinstallする際にパスを指定することにしました。
https://qiita.com/okuramasafumi/items/1aea3ed27763315328a3

$ bundle install --path vendor/bundle

そしてrails sが成功。

どうやら--pathオプションをつけるのは開発時においては必要ないが、異なるバージョンのgemが混ざるのが嫌な人はつけた方が良いとのこと。

プロジェクト下のディレクトリ(例えばvendor/bundle)にgemをインストールすることで、グローバルにインストールされたgemと、bundlerが管理するgemを分離することと書いてあります。

要はrubyのインストールでいうlocal設定とglobal設定と分けることによって作業するディレクトリによってrubyのバージョンを変えられますよ的な話に近しいものだということだと思います。(もう少し理解できれば書き加えます。)

もうちょいわかりやすいエラー文にして欲しいところ。

なぐり書きなので疑問がありましたらコメントください。

こちらに移行しました。
http://code-aim.work/incompatible-library-version/