AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Ruby こわれる〜

rbenv + ruby-build を anyenv 経由でインストールしているのだけれど、 OpenSSL のライブラリを Homebrew でインストールされるものを見ているため、うっかり brew upgrade で依存関係から OpenSSL が更新されると、 Ruby 処理系がまるごと壊れて気絶してしまう。

具体的にこんなエラーになる

これは 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 を参照しなくなったそうな。

参考:

blog.manabusakai.com

たしかに今まさに壊れたので再インストールしてみたら、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 見ないほうが恩恵高そうなので、素直に明示せずに従っときましょう。

github.com

追記 2 : openssl 1.0.x が必要な環境も大丈夫

元々 ruby-build の対応が「OpenSSL 1.0 系を Homebrew が捨てたから、依存をなんとかするやで」ちゅて対応してくれたものなので、当然 OpenSSL 1.0.x 系が必要な Ruby 2.2 とかも rbenv install 2.2.10 とかでオッケーです。