【Rails】M1チップ搭載MacでRuby on Railsの開発環境構築

はじめに

M1チップ搭載MacにRuby on Railsの開発環境を構築する手順を記載します。

  • MacBook Air (M1, 2020)
  • macOS Monterey 12.3.1

Homebrew

Homebrewのインストール

公式サイトに記載されているインストールコマンドを実行します。

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Homebrewのパスを追加

環境変数$PATHにHomebrewのパスを追加します。なお、以下はZ Shellを使っている場合の設定例です。Z Shellではなく別のシェルを使っている場合は適宜読み替えてください。今回は.zshenvで環境変数の設定をしていますが、他の設定ファイルでも大丈夫です。Z Shellの設定ファイルを厳密に使い分けたい場合は、以下のページなどを参考にしてください。

# 設定前の確認
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# Homebrewのパスを追加
% echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshenv

# 設定ファイルを反映
% source ~/.zshenv

# 設定後の確認
% echo $PATH    
/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

~/.zshenv

export PATH="/opt/homebrew/bin:$PATH"

設定後、以下のコマンドを実行しHomebrewのバージョンが確認できればOKです。

% brew --version
Homebrew 3.4.10

rbenv

rbenvのインストール

以下のコマンドを実行し、rbenvをインストールします。なお、rbenvをインストールすると一緒にruby-buildもインストールされます。

# rbenvのインストール
% brew install rbenv

# rbenvの確認
% brew list rbenv

# ruby-buildの確認
% brew list ruby-build

rbenvのシェル設定

以下のコマンドを実行し、表示された指示に従ってシェルを設定します。以下はZ Shellの場合の設定例です。

# 設定前の確認
% which ruby
/usr/bin/ruby

# 初期化コマンド
% rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval "$(rbenv init - zsh)"

# 設定を追加
% echo 'eval "$(rbenv init - zsh)"' >> ~/.zshrc

# 設定を反映
% source ~/.zshrc

# 設定後の確認
% which ruby
/path/to/.rbenv/shims/ruby

~/.zshrc

eval "$(rbenv init - zsh)"

eval "$(...)"は、カッコ内の文字列を評価・連結して実行するコマンドです。rbenv init - zshは、Z Shell用のrbenv初期化コマンドです。

% rbenv init - zsh
export PATH="/path/to/.rbenv/shims:${PATH}"
export RBENV_SHELL=zsh
source '/opt/homebrew/Cellar/rbenv/1.2.0/libexec/../completions/rbenv.zsh'
command rbenv rehash 2>/dev/null
rbenv() {
  local command
  command="${1:-}"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval "$(rbenv "sh-$command" "$@")";;
  *)
    command rbenv "$command" "$@";;
  esac
}

1行目で環境変数$PATHにrbenvのパスを追加しています。この初期化コマンドを実行しておかないと、rbenvでインストールしたRubyバージョンを使うことはできません。

Ruby

Rubyのインストール(失敗)

M1チップ搭載のMacでは以下のコマンドを実行しただけではRubyをインストールすることはできません。以下のようなエラーメッセージが表示され、インストールに失敗してしまいます。

% rbenv install 2.6.3
Downloading openssl-1.1.1n.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a
Installing openssl-1.1.1n...
Installed openssl-1.1.1n to /path/to/.rbenv/versions/2.6.3

Downloading ruby-2.6.3.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.3.tar.bz2
Installing ruby-2.6.3...
ruby-build: using readline from homebrew

BUILD FAILED (macOS 12.3.1 using ruby-build 20220426)

Inspect or clean up the working tree at /var/folders/44/kkybmqys33n9j6_y00q6vqm80000gn/T/ruby-build.20220505131724.16336.ZD48lr
Results logged to /var/folders/44/kkybmqys33n9j6_y00q6vqm80000gn/T/ruby-build.20220505131724.16336.log

Last 10 log lines:
1340 warnings generated.
linking shared-object objspace.bundle
5 warnings generated.
4 warnings generated.
linking shared-object zlib.bundle
1 warning generated.
linking shared-object psych.bundle
422 warnings generated.
linking shared-object date_core.bundle
make: *** [build-ext] Error 2

M1チップ搭載のMacでRubyをインストールするには、インストールコマンドを実行する前に環境変数の設定を行う必要があります。2通りの方法があるので、うまくいくほうを試してみてください。

なお、Rubyのバージョンによってはエラーが出ずインストールできることもあるようですが、将来、新しいRubyバージョンのインストール時に同じエラーを出さないために、以下の対応を行っておくことをおすすめします。

環境変数の設定:方法①

環境変数$RUBY_CFLAGSに以下のいずれかの値を設定します。

# 以下のいずれかを実行
% echo 'export RUBY_CFLAGS="-w"' >> ~/.zshenv
% echo 'export RUBY_CFLAGS="-Wno-error=implicit-function-declaration"' >> ~/.zshenv
% echo 'export RUBY_CFLAGS="-DUSE_FFI_CLOSURE_ALLOC"' >> ~/.zshenv

# 設定を反映
% source ~/.zshenv

~/.zshenv

# 以下のいずれか
export RUBY_CFLAGS="-w"
export RUBY_CFLAGS="-Wno-error=implicit-function-declaration"
export RUBY_CFLAGS="-DUSE_FFI_CLOSURE_ALLOC"

環境変数$RUBY_CFLAGSは、環境変数$CFLAGSの追加オプションを設定します。環境変数$CFLAGSは、CおよびC++コードをコンパイルするときにビルド・システムにコンパイラー・オプションを指定するために従来から使用されている環境変数の1つです。

環境変数の意味も設定値の意味もよくわかっていませんが、私の環境では上記を行うことでRubyをインストールできるようになりました。

環境変数の設定:方法②

rbenv (ruby-build)で使用されるOpenSSLの環境変数を設定します。rbenv (ruby-build)はインストールのたびにOpenSSLをダウンロードしています。

% rbenv install 2.6.3
Downloading openssl-1.1.1n.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a
Installing openssl-1.1.1n...
Installed openssl-1.1.1n to /path/to/.rbenv/versions/2.6.3
...

そもそも、macOSはHigh Sierraから標準のSSL/TLSライブラリとしてLibreSSLを使用しているため、OpenSSLはインストールすらされていない可能性があり(別の依存関係でインストールされている場合もある)、インストールのたびにダウンロードするのが確実ということなんでしょう。

rbenv (ruby-build)で使用するOpenSSLをHomebrewでインストールしたOpenSSLに変更するには以下の手順を行います。

# 設定前の確認
% openssl version
LibreSSL 2.8.3

# OpenSSLのインストール
% brew install openssl@1.1

# 環境変数の設定
% echo 'export PATH="$(brew --prefix openssl@1.1)/bin:$PATH"' >> ~/.zshenv
% echo 'export LDFLAGS="-L$(brew --prefix openssl@1.1)/lib"' >> ~/.zshenv
% echo 'export CPPFLAGS="-I$(brew --prefix openssl@1.1)/include"' >> ~/.zshenv
% echo 'export PKG_CONFIG_PATH="$(brew --prefix openssl@1.1)/lib/pkgconfig"' >> ~/.zshenv
% echo 'export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"' >> ~/.zshenv

# 設定の反映
% source ~/.zshenv

# 設定後の確認
% openssl version
OpenSSL 1.1.1n  15 Mar 2022

~/.zshenv

export PATH="$(brew --prefix openssl@1.1)/bin:$PATH"
export LDFLAGS="-L$(brew --prefix openssl@1.1)/lib"
export CPPFLAGS="-I/$(brew --prefix openssl@1.1)/include"
export PKG_CONFIG_PATH="$(brew --prefix openssl@1.1)/lib/pkgconfig"
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"

環境変数$RUBY_CONFIGURE_OPTSは、rbenv (ruby-build)で使用するOpenSSLを指定しています。その他の環境変数($LDFLAGS $CPPFLAGS $PKG_CONFIG_PATH)の設定は必須ではないかもしれません。$(...)は、カッコ内のコマンド結果を文字列として返します。

% brew --prefix openssl@1.1
/opt/homebrew/opt/openssl@1.1

上記の設定を行うと、インストールのたびに行っていたOpenSSLのダウンロードが行われなくなります。

% rbenv install 2.6.3
Downloading ruby-2.6.3.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.3.tar.bz2
Installing ruby-2.6.3...
ruby-build: using readline from homebrew
...

OpenSSLをインストールしたものの、やっぱりアンインストールしたい場合は以下のコマンドを実行します。

# OpenSSLのアンインストール
% brew uninstall openssl@1.1
Uninstalling /opt/homebrew/Cellar/openssl@1.1/1.1.1n... (8,089 files, 18MB)

Warning: The following openssl@1.1 configuration files have not been removed!
If desired, remove them manually with `rm -rf`:
  /opt/homebrew/etc/openssl@1.1
  ...

# 上記の指示に従って削除
% rm -rf /opt/homebrew/etc/openssl@1.1

Rubyのインストール(成功)

環境変数の設定が完了したら、改めてRubyのインストールを行います。

# Rubyのインストール
% rbenv install 2.6.3

# バージョン確認(rbenv)
% rbenv version
2.6.3 (set by /path/to/.rbenv/version)

# バージョン確認(ruby)
% ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [-darwin21]

Ruby on Rails

Ruby on Railsのインストール

以下のコマンドを実行し、Ruby on Railsをインストールします。最新バージョンをインストールしたい場合、-vオプションは不要です。

# Ruby on Railsのインストール
% gem install rails -v 6.1.3.2

# バージョン確認
% rails -v
Rails 6.1.3.2

バージョン確認コマンド実行時に以下のようなエラーメッセージが表示される場合、以下のコマンドを実行します。

# バージョン確認
% rails -v
Your Ruby version is 2.6.8, but your Gemfile specified 2.6.3

# 以下のコマンドを実行
% rbenv rehash

Bundlerのインストール

以下のコマンドを実行し、Bundlerをインストールします。最新バージョンをインストールしたい場合、-vオプションは不要です。

# Bundlerのインストール
% gem install bundler -v 2.0.2

# バージョン確認
% bundler -v                  
Bundler version 2.0.2

その他のGemのインストール

Gemfileに記述されているGemをインストールします。GitHubなどからRailsアプリをcloneし、そのRailsアプリ配下で以下のコマンドを実行します。

% bundle install

MySQL / PostgreSQL

GemfileにMySQLやPostgreSQLのGemが含まれている場合、Homebrewでインストールしてからbundle installを実行します。

# MySQLのインストール
% brew install mysql

# PostgreSQLのインストール
% brew install postgresql

MySQLやPostgreSQLをインストールする前にbundle installを実行した場合、以下のようなエラーメッセージが表示されます(MySQLの場合の例)。

% bundle install
...
Installing mysql2 0.5.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

...

-----
mysql client is missing. You may need to 'brew install mysql' or 'port install mysql', and try again.
-----

...

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.

In Gemfile:
  mysql2

GitHubのリポジトリ指定

GemfileでGitHubのリポジトリを指定している場合、以下のように修正してからbundle installを実行します。

Gemfile

 gem 'impressionist',
-  git: 'git://github.com/charlotte-ruby/impressionist.git',
+  git: 'https://github.com/charlotte-ruby/impressionist.git',
   ref: '46a582ff8cd3496da64f174b30b91f9d97e86643'

Gemfileを修正する前にbundle installを実行した場合、以下のようなエラーメッセージが表示されます。

% bundle install
fatal: remote error: 
  The unauthenticated git protocol on port 9418 is no longer supported.
Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.

...

動作確認

いよいよ最後の動作確認になりました。rails serverを起動し、Railsアプリが表示できるか確認しましょう。

復号化キーの準備

機密情報の保持にCredentialsを使っている場合、復号化キーを準備する必要があります。具体的にはRailsアプリを開発していた旧PCやRailsアプリをホスティングしているサーバーから以下の情報を取得します。

  • ファイル/path/to/app/config/master.key
  • 環境変数$RAILS_MASTER_KEY

どうしても復号化キーを準備できない場合、Credentialsの機密情報を再作成する必要があります。その場合、既存の機密情報は失われてしまうのでご注意ください。Credentialsについて詳しくは以下の記事を参照してください。

復号化キーを準備する前にrails serverを起動すると以下のようなエラーメッセージが表示されます。復号化キーが見つからないとnilが返されるため、「nilに未定義のメソッド」というエラーが発生しています。

% rails server
...
/path/to/app/config/database.yml:34:in `<main>': Cannot load database configuration:
undefined method `[]' for nil:NilClass (NoMethodError)

Action Text

RailsアプリでAction Textを使っている場合、Action Textをインストールします。

% rails action_text:install

マイグレーションの実行

マイグレーションを実行します。

% rails db:migrate

まとめ

M1チップ搭載MacにRuby on Railsの開発環境を構築する手順をまとめてみました。M1チップ搭載Macならではの事象としては、rbenvでRubyのインストールしようとした時に発生したエラーくらいでしょうか。おそらく最も詰まるポイントではないかと思います。

本記事の内容は私の環境に基づいたものになります。あくまで参考情報として参照していただければと思います。

関連記事

【Rails】Paranoiaを使用した論理削除(ソフトデリート)
# はじめに Paranoiaは、Railsアプリケーションで論理削除(ソフトデリート)を実現するためのGemです。 論理削除は、データベースのレコードを物理的に削除するのではなく、削除フラグを設定することで「削除済み」とみなす方法です。こ [...]
2024年7月20日 21:33
【Rails】activerecord-multi-tenantを使用したマルチテナントアプリケーションの作成
# はじめに マルチテナントアプリケーションでは、複数の顧客(テナント)が同じアプリケーションを利用するため、データの分離が必要です。 activerecord-multi-tenantは、このようなマルチテナント環境をサポートするための便 [...]
2024年7月18日 16:50
【Rails】RubyとRailsにおけるattr_reader, attr_writer, attr_accessorの概念と使用方法
# はじめに RubyとRailsの開発において、`attr_reader`,`attr_writer`,`attr_accessor`は非常に便利なメソッドです。これらは、クラス内でインスタンス変数に対するゲッターおよびセッターメソッドを簡単に [...]
2024年7月17日 18:11
【Rails】RubyとRailsにおけるyieldの概念と使用方法
# はじめに RubyとRailsにおける`yield`は、メソッドやテンプレートの中で動的にコードブロックを実行する能力を提供し、これによってコードの再利用性と拡張性が大幅に向上します。本記事では、RubyとRailsにおける`yield`の概 [...]
2024年7月17日 13:15
【Rails】AASMを使用してオブジェクトの状態遷移を効率的に管理
# はじめに Railsアプリケーションにおいて、オブジェクトの状態管理は重要な課題の一つです。AASM (Acts As State Machine) gemは、複雑な状態遷移を効率的に管理します。本記事では、AASMの基本的な使い方を解説して [...]
2024年7月16日 18:00
【Rails】RSpec + Swagger + rswagでアプリケーションのAPIをテストおよびドキュメント化する方法
# はじめに Railsアプリケーションの開発において、APIのテストとドキュメント化は重要な要素です。 RSpecはテストフレームワークとして広く利用されており、SwaggerはAPIの設計とドキュメント化を支援します。これらを統合するr [...]
2024年7月16日 14:27
【Rails】mailcatcherを使用して開発環境でメール送信をテストする方法
# はじめに mailcatcherは、開発環境でのメール送信をキャプチャするためのツールです。ローカルで送信されたメールをブラウザ上で簡単に確認できるようにします。mailcatcherをRailsアプリケーションで使用する方法について説明しま [...]
2024年7月15日 16:37
【Rails】impressionistを使用してページビューやクリック数を追跡する方法
# はじめに impressionist Gemを使用してRailsアプリケーションでページビューやクリック数を追跡する方法について説明します。 # 実装方法 ## impressionist Gemのインストール まず、impre [...]
2024年7月15日 14:18