rbenv + ruby-build を anyenv 経由でインストールしているのだけれど、 OpenSSL のライブラリを Homebrew でインストールされるものを見ているため、うっかり brew upgrade
で依存関係から OpenSSL が更新されると、 Ruby 処理系がまるごと壊れて気絶してしまう。
- 具体的にこんなエラーになる
- 手っ取り早く治すには
- なんでこんなことになるんや!
- 追記: ruby-build の releases に書いてあった
- 追記 2 : openssl 1.0.x が必要な環境も大丈夫
具体的にこんなエラーになる
これは migrate しようとしたとき。
LoadError: dlopen(/#{RAILS_ROOT}/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
つらい。
手っ取り早く治すには
今使ってる Ruby の再インストールです。 上記の場合だと Ruby 2.6.5 を利用していたので、
$ rbenv install 2.6.5
これであとはしばらく待てば、 OpenSSL リンクされなおした Ruby が戻ってきます。
再度 gem install bundler
してから、 RAILS_ROOT 以下で bundle install
なりして環境修復しましょう。
なんでこんなことになるんや!
とおもったら、ついに ruby-build がグローバルに配置されている OpenSSL を参照しなくなったそうな。
参考:
たしかに今まさに壊れたので再インストールしてみたら、OpenSSL コンパイルされてるっぽいすねえ。 これ Ruby が参照する OpenSSL アップデート方法調べとかないと後々困っちゃいそう。 しかしこれ、 rvm を思い出す動作ですねえ。 あっちは cd を置き換えたりするので邪悪って感じでしたが、バージョン固定は強くて、保守してる古い環境で一部まだ現役なのでこまっちゃう……。
$ rbenv install 2.6.5 rbenv: /Users/ワイの名前/.anyenv/envs/rbenv/versions/2.6.5 already exists continue with installation? (y/N) y Downloading openssl-1.1.1d.tar.gz... -> https://dqw8nmjcqpjn7.cloudfront.net/1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2 Installing openssl-1.1.1d... Installed openssl-1.1.1d to /Users/ワイの名前/.anyenv/envs/rbenv/versions/2.6.5 Downloading ruby-2.6.5.tar.bz2... -> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.5.tar.bz2 Installing ruby-2.6.5... ruby-build: using readline from homebrew Installed ruby-2.6.5 to /Users/ワイの名前/.anyenv/envs/rbenv/versions/2.6.5
gem pristine
uninstall せずに上記の作業通してしまうと、残った Gem が壊れて以下のようなお気持ちを表明されます。
Ignoring nokogiri-1.10.5 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.5
出力のとおり個別にpristine しても良いんですが、以下のようにすると一斉に綺麗にできました。 過去失敗したワイはなんで失敗したんでしょうね?(過去の書き込みを見つつ)
$ gem pristine --all
追記: ruby-build の releases に書いてあった
Stop automatically linking to Homebrew OpenSSL.
Homebrew 経由でインストールされる OpenSSL との自動紐付けをやめたそうです。 rbenv のインストール実行時に環境変数を渡すことで、明示的に Homebrew の OpenSSL と紐付けも可能とのこと(このリリース以前の動作ですね)。 マー Homebrew の OpenSSL 見ないほうが恩恵高そうなので、素直に明示せずに従っときましょう。
追記 2 : openssl 1.0.x が必要な環境も大丈夫
元々 ruby-build の対応が「OpenSSL 1.0 系を Homebrew が捨てたから、依存をなんとかするやで」ちゅて対応してくれたものなので、当然 OpenSSL 1.0.x 系が必要な Ruby 2.2 とかも rbenv install 2.2.10
とかでオッケーです。