Rails コア開発環境の構築方法

本ガイドでは、Ruby on Rails自体の開発環境を構築する方法について解説します。

このガイドの内容:

1 おすすめの方法

Rails development boxにあるできあいのdevelopment環境を入手するのがおすすめです。

2 面倒な方法

Rails development boxを利用できない事情がある場合は、この先をお読みください。Ruby on Railsコア開発で必要なdevelopment boxを手動でビルドする手順を解説します。

2.1 Gitをインストールする

Ruby on Railsではソースコード管理にGitを使用しています。インストール方法についてはGitホームページに記載されています。Gitを学ぶための資料はネット上に山ほどあります (特記ないものは英語)。

  • Try Git courseは、対話的な操作のできるコースで基礎を学べます。
  • Git公式ドキュメントには多くの情報がまとめられており、Gitの基礎を学べる動画もあります。
  • Everyday Gitは最小限必要なGitの知識を学ぶのに向いています。
  • GitHubにはさまざまなGit関連リソースへのリンクがあります。
  • Pro Git日本語版ではGitについてすべてをカバーした書籍がさまざまな形式で翻訳されており、クリエイティブ・コモンズ・ライセンスで公開されています。

2.2 Ruby on Railsリポジトリをクローンする

Ruby on Railsのソースコードを置きたいディレクトリ (そこにrailsディレクトリが作成されます) で以下を実行します。

$ git clone https://github.com/rails/rails.git
$ cd rails

2.3 セットアップとテストを行う

リポジトリに送信されるコードは、テストスイートにパスしなければなりません。自分でパッチを書いた場合や、他の人が書いたパッチを詳しく評価する場合にも、テストを実行できるようにしておく必要があります。

最初にSQLite3をインストールし、sqlite3 gem用のSQLite3開発ファイルもインストールします。macOSの場合は以下を実行します。

$ brew install sqlite3

Ubuntuなら以下で行えます。

$ sudo apt-get install libsqlite3x libsqlite3x-devel

FedoraやCentOSの場合は以下を実行します。

$ sudo yum install sqlite3 sqlite3-devel

Arch Linuxなら以下を実行する必要があります。

$ sudo pacman -S sqlite

FreeBSDの場合は以下を実行します。

# pkg install sqlite3

あるいはdatabases/sqlite3のportsをコンパイルします。

Bundlerの最新バージョンを入手します。

$ gem install bundler
$ gem update bundler

続いて以下を実行します。

$ bundle install --without db

このコマンドによって、MySQLとPostgreSQL用のRubyドライバを除いて必要なファイルがすべてインストールされます。続きは後ほど行います。

memcachedを使用するテストを実行したい場合は、memcachedがインストールされ、実行可能であることを確認する必要があります。

macOSの場合、Homebrewを使用してmemcachedをインストールできます。

$ brew install memcached

Ubuntuの場合はapt-getを使用できます。

$ sudo apt-get install memcached

FedoraやCentOSの場合はyumを使用します。

$ sudo yum install memcached

Arch Linuxの場合は以下のようにします。

$ sudo pacman -S memcached

FreeBSDの場合は以下のようにします。

# pkg install memcached

あるいはdatabases/memocachedのportsをコンパイルすることもできます。

依存ファイルのインストールがこれで終わったので、以下のコマンドでテストスイートを実行します。

$ bundle exec rake test

Action Packなど、特定のコンポーネントのテストだけを実行することもできます。該当のディレクトリに移動して同じコマンドを実行します。

$ cd actionpack
$ bundle exec rake test

特定のディレクトリにあるテストを実行したい場合、 TEST_DIR環境変数を使用する方法もあります。たとえば、railties/test/generatorsディレクトリのテストだけを実行したい場合は以下のようにします。

$ cd railties
$ TEST_DIR=generators bundle exec rake test

以下の方法で特定のテストだけを実行することもできます。

$ cd actionpack
$ bundle exec ruby -Itest test/template/form_helper_test.rb

特定のファイルに含まれるひとつのテストだけを実行するには以下のようにします。

$ cd actionpack
$ bundle exec ruby -Itest path/to/test.rb -n test_name

2.4 Railtiesをセットアップする

Railtiesテストの一部はJavaScriptランタイム環境に依存しています(Node.jsをインストールする前提など)。

2.5 Active Recordをセットアップする

Active Recordのテストスイートの実行は4回試みられます。SQLite3で1回、MySQLの2つのgem(mysqlmysql2)でそれぞれ1回、PostgreSQLで1回です。それぞれについて環境構築方法を解説します。

Active Recordのコードに手を付ける場合、最低でもMySQL、PostgreSQL、SQLite3のテストにはすべてパスしなければなりません。MySQLでしかテストを行なっていないようなパッチは、一見問題なさそうに見えても、さまざまなアダプタごとの微妙な違いに対応しきれていないことが非常に多く、ほとんどの場合受理されません。

2.5.1 データベースの設定

Active Recordテストスイートでは、activerecord/test/config.ymlというカスタム設定ファイルが必要です。設定例はactiverecord/test/config.example.ymlに記載されているので、これをコピーして各環境で使用できます。

2.5.2 MySQLとPostgreSQL

MySQLとPostgreSQLに対してテストスイートを実行できるようにするには、そのためのgemも必要です。最初にサーバーをインストールし、次にクライアントライブラリをインストール、そして開発用ファイルをインストールします。

macOSの場合、以下を実行できます。

$ brew install mysql
$ brew install postgresql

詳しくはHomebrewのヘルプを参照してください。

Ubuntuの場合は以下を実行します。

$ sudo apt-get install mysql-server libmysqlclient-dev
$ sudo apt-get install postgresql postgresql-client postgresql-contrib libpq-dev

FedoraやCentOSの場合は以下を実行します。

$ sudo yum install mysql-server mysql-devel
$ sudo yum install postgresql94-server postgresql94-devel

Arch LinuxではMySQLがサポート対象外になったため、MariaDBを代わりに使用します (詳細はMariaDB replaces MySQL in repositoriesを参照)。

$ sudo pacman -S mariadb libmariadbclient mariadb-clients
$ sudo pacman -S postgresql postgresql-libs

FreeBSDの場合は以下を実行する必要があります。

# pkg install mysql56-client mysql56-server
# pkg install postgresql93-client postgresql93-server

Portsを使用してインストールすることもできます (databasesフォルダの下に置かれます)。 MySQLのインストール中に問題が生じた場合は、MySQLドキュメント (英語) を参照してください。

以上の設定が終わったら、以下を実行します。

$ rm .bundle/config
$ bundle install

最初に、.bundle/configを削除します。これは、インストールしたくない"db"グループのファイルをBundlerが覚えてしまっているのを消去するためです。ファイルを削除する代わりに編集しても構いません。

MySQLでテストスイートを実行できるようにするには、データベースにrailsというユーザーアカウントを作成し、このアカウントにtestデータベースへのアクセス権を与える必要があります。

$ mysql -uroot -p

mysql> CREATE USER 'rails'@'localhost';
mysql> GRANT ALL PRIVILEGES ON activerecord_unittest.*
       to 'rails'@'localhost';
mysql> GRANT ALL PRIVILEGES ON activerecord_unittest2.*
       to 'rails'@'localhost';
mysql> GRANT ALL PRIVILEGES ON inexistent_activerecord_unittest.*
       to 'rails'@'localhost';

続いてtestデータベースを作成します。

$ cd activerecord
$ bundle exec rake db:mysql:build

PostgreSQLでは認証方法が異なります。LinuxやBSDでdevelop環境にdevelopmentアカウントを設定するには、以下を実行します。

$ sudo -u postgres createuser --superuser $USER

macOSの場合は以下を実行します。

$ createuser --superuser $USER

続いて以下を実行してtestデータベースを作成します。

$ cd activerecord
$ bundle exec rake db:postgresql:build

PostgreSQLとMySQLの両方を使用するデータベースをビルドすることもできます。

$ cd activerecord
$ bundle exec rake db:create

データベースを消去(drop)するには以下を実行します。

$ cd activerecord
$ bundle exec rake db:drop

testデータベースの作成にはRake タスクを使用してください。これにより、文字セットと照合順序が正しく設定されます。

PostgreSQL 9.1.x 以前のHStore拡張機能を有効にしようとすると次のような警告 (メッセージはローカライズされることもあります) が表示されます: 「WARNING: => is deprecated as an operator」

他のデータベースを採用する場合は、activerecord/test/config.ymlactiverecord/test/config.example.ymlにデフォルトの接続情報があることをチェックしてください。必要であればactiverecord/test/config.ymlを編集して、認証情報を別のものに変更することもできます。ただし、この臨時の認証情報をRailsのリポジトリに反映しないよう気を付けてください。

2.6 Action Cableのセットアップ

Action CableではデフォルトのサブスクリプションアダプタとしてRedisを用います(詳細)。このため、Action CableのテストがパスするにはRedisをインストールして実行中にしておく必要があります。

2.6.1 Redisをソースからインストールする

Redisのドキュメントに記載されている、パッケージマネージャによるインストール方法は古いものが多い点が残念です。ソースからインストールしてサーバーを立ち上げる方式の方が単純明快であり、Redisのドキュメントにも詳しく記載されています。

2.6.2 Redisをパッケージマネージャでインストールする

macOSの場合は以下を実行できます。

$ brew install redis

後はHomebrewが表示する指示に従って進めます。

Ubuntuの場合は以下を実行するだけで完了します。

$ sudo apt-get install redis-server

FedoraまたはCentOSの場合は以下を実行します(EPELを有効にする必要があります)。

$ sudo yum install redis

Arch Linuxを実行している場合は、以下を実行します。

$ sudo pacman -S redis
$ sudo systemctl start redis

FreeBSDユーザーは以下を実行しなければなりません。

# portmaster databases/redis