おれろぐ #z_a_ki3

(・∀・) オイ!

Ruby on Rails の開発環境つくってみた

普段、Javaでジャバジャバしてる私がRuby on Railsの環境構築した時の備忘録であり、
SIer様が言うところの新規参画者向けの"環境構築手順書"的な位置づけです。

ベストプラクティスではないと思いますが、構築に際して下記要件を意識しています。

  • 開発環境と本番環境の差違を減らして余計なトラブルを避けたい。
  • MacでもWindowsでも同じ環境を作れるようにしたい。
  • 開発は補完・デバッグまで出来るようにしたい。

裏付けはありませんが、WindowsRubyの相性が良く無さそうな事とMac環境に
依存することも避けたい、本番環境は大抵LinuxなのでVirtualBox+Vagrant
仮想Linux環境を作ることにしました。

仮想環境を作成する為、PCのメモリは4GB以上は欲しいです。

コーディングに関してテキストエディタ派とIDE派で分かれているようですが、
普段JavaIDEを使うことに馴れてしまっている事もあるので、IDEを選択しました。

Rubu on Railsに対応したIDEですが、メジャーどころでNetBeansとRubyMineがあり、
NetBeansは無償かつJavaEE系の開発にも最適化されているので使いたいところですが、
残念ながら公式でサポート終了*していることもあるので今回はRubyMineを使ってみます。

*Ruby, Ruby on Rails Support Discontinued in NetBeans IDE


[2015/3/1追記]
RubyMineを導入したかったのですが、知識不足での環境構築が良い感じに出来なかった為、
しばらくはテキストエディタを使っていきたいと思います。

補完・デバッグはエディタのプラグインデバッグ用Gemでどうにか出来ればと思います。


※開発環境の為、セキュリティ対策は皆無ですので、注意してくださいね。

1.VirtulBoxのインストール

以下のサイトから最新版のプログラムをダウンロードし、インストールします。 https://www.virtualbox.org/

2.Vagrantのインストール

以下のサイトから最新版のプログラムをダウンロードし、インストールします。 https://www.vagrantup.com/

インストールが完了したらターミナルからバージョンを確認します。

$ vagrant --version
Vagrant 1.7.2

3.仮想環境を作成する。

Vagrantでは仮想イメージをBoxと呼ばれるパッケージで管理します。

仮想マシンを作成、OSを0からインストールしても良いのですが、ここではさっさと開発環境を
作成してしまいたいので、公開されているBoxファイルを使用します。

今回はサーバ構成自動化ツールのChefが公開しているBoxを使いたいと思います。 https://vagrantcloud.com/chef

CentOS6.6のBoxは chef/centos-6.6 になります。

まず、Box名を指定して初期設定をします。

$ vagrant init chef/centos-6.6

カレントディレクトリに Vagrantfile が作成されるのでこれを修正します。

# 以下の行のコメントを外す(ブリッジ接続になります。)
# config.vm.network "public_network"

# 以下の行のコメントを外す(メモリ割り当てが1024MBになります。)
# config.vm.provider "virtualbox" do |vb|
#   # Customize the amount of memory on the VM:
#   vb.memory = "1024"
# end

今回はブリッジ接続にしましたが、ホストオンリーアダプタにする場合は、
以下の行のコメントを外します。

  # config.vm.network "private_network", ip: "192.168.33.10"

編集が終わったら仮想マシンを構築、起動します。

$ vagrant up

初回起動時にブリッジするインタフェースを選択するよう聞かれるので指定します。

==> default: Available bridged network interfaces:
1) en0: Wi-Fi (AirPort)
2) en1: Thunderbolt 1
3) en2: Thunderbolt 2
4) p2p0
5) awdl0
6) bridge0
==> default: When choosing an interface, it is usually the one that is
==> default: being used to connect to the internet.
    default: Which interface should the network bridge to? 1

起動したら試しにターミナルからsshで接続してみます。

$ vagrant ssh

実行すると仮想環境にログインできます。

$ vagrant ssh
Last login: Tue Feb 24 19:29:31 2015 from 10.0.2.2
[vagrant@localhost ~]$

念の為、OSのバージョンを確認してみます。

[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS release 6.6 (Final)

続いてネットワークの構成を確認します。

[vagrant@localhost ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:6B:1C:DD
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe6b:1cdd/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:379 errors:0 dropped:0 overruns:0 frame:0
          TX packets:241 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:42250 (41.2 KiB)  TX bytes:33387 (32.6 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:56:51:14
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: 2408:212:5e0:1200:a00:27ff:fe56:5114/64 Scope:Global
          inet6 addr: fe80::a00:27ff:fe56:5114/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2436 (2.3 KiB)  TX bytes:1264 (1.2 KiB)

※eth1がブリッジアダプタで、開発時はこのアドレスにアクセスします。

問題が無ければ、ここで一度 yum update でシステムのアップデートをします。

[vagrant@localhost ~]$ sudo yum update

以上で仮想環境の作成が完了です。
これからは開発環境として関連するソフトウェアのインストールをしていきます。

※再起動した際、共有フォルダのマウントで以下のエラーが発生した場合

==> default: Mounting shared folders...
    default: /vagrant => /Users/[ユーザーid]
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

VirtualBox の Guest additions を再セットアップすると治るようです。

[vagrant@localhost ~]$ sudo /etc/init.d/vboxadd setup
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]
[vagrant@localhost ~]$

参考
VirtualBox + Vagrant で自分用のboxファイルを作成する - uehatsu's tech blog
Hashicorp社の新サービスATLASと周辺ツールのまとめ
Vagrantのネットワーク周りのあれこれ | Septeni Engineers' Blog | セプテーニ エンジニアブログ
vagrant upでmountエラーがでる場合の対処法 - Qiita

4.開発環境を構築する。

仮想環境に必要な以下のソフトウェアをインストールします。

  • ライブラリ群
  • rbenv(Rubyバージョン管理)
  • ruby
  • bundler(Gemパッケージ管理)

Rubyバージョン管理システムについてはrvmとrbenvの2つが良く使用されていますが、
rbenvの方がシンプルと言うことでrbenvを採用します。

4-1. ライブラリ群

必要なライブラリをまとめてyumインストールします。

$ sudo yum install kernel-devel git gcc gcc-c++ openssl-devel zlib-devel libyaml-devel libffi-devel readline-devel tcl-devel tk-devel gdbm-devel bison libxml2-devel libxslt-devel patch sqlite-devel

インストールするライブラリ
kernel-devel, git, gcc, gcc+, openssl-devel, zlib-devel, libyaml-devel, libffi-devel,
readline-devel, tcl-devel, tk-devel, gdbm-devel, bison, libxml2-devel, libxslt-devel,
patch, sqlite-devel

4-2. rbenv

GitHubリポジトリからクローンします。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

設定ファイル .bash_profile に必要な設定を追加します。

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

設定ファイルを再読込します。

$ source .bash_profile

バージョンを確認します。

$ rbenv --version
rbenv 0.4.0-138-g4d0c289

ruby-buildをGitHubリポジトリからクローンします。

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

参考
rbenv/README.md at master
ruby-build/README.md at master

4-3. ruby

インストール可能なバージョン一覧を確認する。

$ rbenv install --list

可能な限り最新の安定版をインストールする。

$ rbenv install -v 2.2.0

rbenvを更新し、インストールされているバージョン一覧を確認する。

# 更新
$ rbenv rehash
# 一覧表示
$ rbenv versions
  2.2.0

インストールしたバージョンに切り替えて、確認する。

# 切り替え
$ rbenv global 2.2.0
# 確認
$ ruby --version
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]

インタプリタを起動してRubyを実行してみる。

$ irb
irb(main):001:0> puts "こんにちは世界"
こんにちは世界
=> nil
irb(main):002:0> [ctrl+Dで終了]

参考
Linux - Ruby 2.1.x ソースからコンパイルインストール - CentOS 6.5
rbenv を使って ruby をインストールする(CentOS編) - Qiita

4-4. bundler

Gemパッケージの管理ツールであるbundlerをインストールします。

$ rbenv exec gem install bundler
$ rbenv rehash

参考
Command Reference - RubyGems Guides

5.Railsプロジェクトを作成する。

標準でゲストOSの /vagrant フォルダが共有フォルダになっているのでRailsプロジェクト用に
フォルダを作成する。

$ mkdir /vagrant/rails
$ cd /vagrant/rails

Gemfileを作成

$ rbenv exec bundle init

Gemfileを修正

source "https://rubygems.org"
# railsは最新バージョンを指定する。
gem "rails", "4.2.0"

ちなみにRailsの最新バージョンを確認する場合

[vagrant@localhost rails]$ gem search -r ^rails$

*** REMOTE GEMS ***

rails (4.2.0)

全てのバージョンを確認する場合

[vagrant@localhost rails]$ gem search -r ^rails$ -a

*** REMOTE GEMS ***

rails (4.2.0, 4.1.9, 4.1.8, 4.1.7.1, 4.1.7, 4.1.6, 4.1.5, 4.1.4, 4.1.3, 4.1.2, 4.1.1, 4.1.0, 4.0.13, 4.0.12, (以下省略)

-r オプションはリモートを検索対象に、^rails$正規表現で [行頭]rails[行末] を表している。

Rails を ./vender/bundle ディレクトリにインストールする。

$ rbenv exec bundle install --path ./vendor/bundle

インストールされたGemを確認する。

rbenv exec bundle list
$ rbenv exec bundle list
Gems included by the bundle:
  * actionmailer (4.2.0)
  * actionpack (4.2.0)
       〜略〜
  * rails (4.2.0)
       〜略〜

Railsプロジェクトを作成する。

$ rbenv exec bundle exec rails new project_name --skip-bundle

--skip-bundleオプションを必ず指定すること。
指定しない場合、Rubyのインストール先にGemパッケージがインストールされてしまいます。

作成したRailsプロジェクトのフォルダに移動し、bundle install を実行する。

$ cd project_name/
$ pwd
/vagrant/rails/project_name
$ rbenv exec bundle install --path ./vendor/bundle

GemパッケージをGitの管理対象外とする為、./vendor/bundle ディレクトリのパスを .gitignore に追加する。

$ echo './vendor/bundle' >> .gitignore

Railsアプリケーションを起動してみます。

$ rbenv exec bundle exec rails server --binding=0.0.0.0

多くのWebサイトの情報ではデフォルトで0.0.0.0にバインドすると書いてあったものの、
動かしてみるとlocalhostにバインドされてしまい、他の端末からアクセスできなかったので
-binding オプションで指定してあげます。

(どうやらRails4.2.0から変更があったみたいですね。)

# localhostにバインドされている。(デフォルト)
=> Rails 4.2.0 application starting in development on http://localhost:3000
# 0.0.0.0にバインドする。
=> Rails 4.2.0 application starting in development on http://0.0.0.0:3000

ホストPC(Mac or Windows)からアクセスして Welcome aboard 画面が表示されればRails
起動確認は完了です。

f:id:z_a_ki3:20150227220828p:plain

Rails本体をインストールするためのbundle installとrailsアプリとしてのbundle installがあって、
ちょっと分かりづらいかな・・・

参考
rbenv インストールから Bundler を使用した Rails のローカルインストールと起動まで - Qiita
Rubyアソシエーション: アプリケーションの土台作成
rails serverでポートを指定して起動する - 感謝のプログラミング 10000時間
Rails4.2beta1をインストールして最初にはまったこと TECHSCORE BLOG

## 6.IDEをインストールする。

ここまで来たら既にテキストエディタで開発ができるようになっていると思います。
だいぶ長くなってしまったので、続きは後半で。。。