Techioz Blog

特定のバージョンの Ruby のインストールに関する問題 (OpenSSL の問題)

概要

Sonoma を実行している 2020 Intel Mac を持っています。 Rails で実行される Web アプリ プロジェクトに取り組んでいます。ここ数か月間、何を試しても同じ問題が発生しました。 Rails の Web サイトの手順に従っていますが、OpenSSL エラーが発生し続けます。パッケージマネージャーとしてasdf、rvm、rbenvを試し、アプリが実行されるRuby 3.0.4をインストールしようとしています。

次のようなエラーが発生し続けます。

*** Following extensions are not compiled:
openssl:
    Could not be configured. It will not be installed.

OpenSSL をダウンロードして再ダウンロードし、さまざまなバージョンを試し、それに応じてパスを変更したり、フラグなどを変更したりしてみました。ただし、私のマシンではこれを機能させることができないようです。最終的には Oracle VirtualBox 上で動作させることができましたが、私の Mac 上でのみ実行したいと考えています。

誰でもアイデアや解決策を持っています。さまざまなウェブサイトでこれに関する多くの投稿を見てきたので、多くの人が問題を抱えているようですが、私にとっては何もうまくいきません。ありがとう!

解決策

Ruby 3.0 には OpenSSL バージョン 1.1 が必要ですが、これは現在かなり古く、多くの環境ではサポートされていません。最新の OpenSSL バージョンを使用する Ruby 3.1 以上で実行されるようにアプリをアップグレードすることをお勧めします。

とはいえ、OSX では homebrew、rbenv、ruby-build を使用してこれを実行できます。このガイドでは rbenv を Ruby マネージャーとして使用することに注意してください。他のもの (rvm など) を使用する場合は、それに対応するためにガイドの一部を変更する必要があります。 (またはアンインストールして rbenv に切り替えます)

以下のガイドでは Ruby 3.0.4 ではなく 3.0.6 をインストールすることに注意してください。これは 3.0.x ブランチの最新版であるため、おそらくこのバージョンに移行する必要がありますが、既存のアプリが壊れることはありません。

また、必要に応じて、以下の手順は Ruby 2.7 でも機能することに注意してください。 2.6 ではある程度の成功を収めましたが、それを実行するには他にもいくつかの手順が必要でしたが、覚えていません。

brew install rbenv

if [ -n "$ZSH_VERSION" ]; then
  SHELL_CONFIG_FILE_PATH=~/.zshrc
elif [ -n "$BASH_VERSION" ]; then
  SHELL_CONFIG_FILE_PATH=~/.bashrc
else
  SHELL_CONFIG_FILE_PATH=~/.profile
fi

echo "eval '$(rbenv init -)'" >> $SHELL_CONFIG_FILE_PATH
echo "export PATH='$HOME/.rbenv/bin:$PATH'" >> $SHELL_CONFIG_FILE_PATH
source $SHELL_CONFIG_FILE_PATH

RVM や chruby などの他のものを使用する場合は、上記の手順を省略できますが、ruby-build は rbenv で最適に動作することに注意してください。

brew install ruby-build
brew install [email protected]
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix [email protected])"
rbenv install 3.0.6

rbenv を使用しない場合は、ruby-build をネイティブに使用する必要があることに注意してください。

export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix [email protected])"
ruby-build 3.0.6 /opt/rubies/3.0.6

次に、他の Ruby マネージャーがこのバージョンの Ruby を指すように設定します。

Rosetta で実行されている Intel Mac または Homebrew の場合:

ln -sf /usr/local/opt/[email protected]/lib/libcrypto.dylib /usr/local/lib/libcrypto.dylib
ln -sf /usr/local/opt/[email protected]/lib/libssl.dylib /usr/local/lib/libssl.dylib

ARM Macの場合:

ln -sf /opt/homebrew/opt/[email protected]/lib/libcrypto.dylib /usr/local/lib/libcrypto.dylib
ln -sf /opt/homebrew/opt/[email protected]/lib/libssl.dylib /usr/local/lib/libssl.dylib
rbenv local 3.0.6

gem install openssl -v '2.2.3' -- --with-openssl-dir=$(brew --prefix [email protected])

(バンドル ファイルにある openssl gem バージョンごとにこれを実行します)

一部の gem は別の openssl にリンクする必要がある場合があります。その場合は、以下を使用できます。たとえば、puma と eventsmachine に問題がありました。

brew install openssl@3 openssl

bundle config set --global build.eventmachine --with-ssl-dir=$(brew --prefix openssl@3)
bundle config set --global build.puma --with-openssl-dir=$(brew --prefix openssl@3)

これらの手順は完了し、2024 年 1 月の時点でも、Intel Mac と ARM Mac の両方の Sonoma で動作します。

また、3.0.6 のサポートを維持しながら新しい Ruby をインストールする必要がある場合は、以下を使用する必要があります。

export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@3)"

rbenv install 3.1.4
# works with 3.2 and 3.3 as well