ruby 2.2.2、Rails 4.2.3で開発しているプロジェクトがあるのだが、久しぶりに立ち上げようとしたところ、
`const_missing': library not found for class Digest::SHA1 -- digest/sha1 (LoadError)
となってしまった。
「さわってないのに壊れた!」と思った。思い当たる節といえば、macOSやXCodeのアップデートぐらいだ。濡れ衣かもしれないが。
解決方法を検索したところ、rubyを一度アンインストールしてインストールし直すという方法しか見つからず、思い切って実行した。(rubyのバージョン管理はrbenvを使用)
ものすごく長い道のりだったので、ログを残しておく。
❶ rubyの再インストール
rbenv uninstall 2.2.2
rbenv install 2.2.2
rbenv local 2.2.2
これでOKだ。
インストールにたびたび失敗したが、時間をおいたら成功した。
❷ bundlerのインストール
rbenv exec gem install bundler -v 1.16.0
これでOKだ。
引数なしの、
rbenv exec gem install bundler
だと、
ERROR: Error installing bundler:
bundler requires Ruby version >= 2.3.0.
というエラーが出る。
しかし、このプロジェクトはrubyのバージョンを上げるわけにはいかない。
なので、
rbenv exec gem install bundler -v 1.16.0
とbundlerのバージョンを引数で渡し、2.2.2のままでインストールする。
❸ bundle install を実行
XCodeを起動しXcode Command Line Toolsをインストールする
brew install v8-315
bundle config --local build.libv8 --with-system-v8
bundle config --local build.therubyracer --with-v8-dir=$(brew --prefix v8-315)
./bin/bundle install
これでOKだ。
いきなり、
./bin/bundle install
を実行すると、
Could not find json-1.8.6 in any of the sources
というエラーが出たが、これはXcode Command Line Toolsをインストールしたら解決した
次に、
Could not find therubyracer-0.12.2 in any of the sources
というエラーが出たが、
brew install v8-315
bundle config --local build.libv8 --with-system-v8
bundle config --local build.therubyracer --with-v8-dir=$(brew --prefix v8-315)
とv8を調整したら解決した。
❹ opensslのバージョンを切り替える
brew switch openssl 1.0.2s
これでOKだ。(ただし人によってバージョンは違う可能性がある)
./bin/rails s
で、railsを起動しようとしたら、
Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib (LoadError)
というエラーが出た。
openssl 1.0.0がないのかな?と思い、
brew switch openssl 1.0.2s
でバージョンを切り替えたらエラーが消えた。
❺ railsの起動
./bin/rails s -b 0.0.0.0
これでOKだ。
僕はIPでもアクセスしたいので -b 0.0.0.0も渡している。
解決までに1時間掛かった。
この記事が誰かの役に立つ可能性は少ないが、少なくとも自分がまた同じ状態になったら参考にしようと思う。