Windows8.1 + Vagrant + Ruby2.2.0 + Rails4.2.0 環境構築

# 始めに
Windows環境でVirtualBox + Vagrantを使用してRailsの開発環境を構築したいと思います。
私が参考にしたエントリは以下になります。

【Windows7】VirtualBox ＋ Vagrant ＋ Ruby + Rails4 開発環境の構築【初心者必見】 - Qiita
http://qiita.com/Gin326M/items/01c8aef45f9a55b9b028

途中まで手順通り進めていましたが、新しいバージョンなどによって一部追加しなければならないことがあったため、実際に行った作業を残しておくことにしました。

# Windowsの環境
- Windows8.1 Pro 64bit
- VirtualBox 4.3.12
- Vagrant 1.7.2

# 構築環境
- CentOS 6.5
- Ruby 2.2.0
- Ruby on Rails 4.2

# Hyper-Vを無効化

「Windowsの機能の有効かまたは無効化」で無効化しておきます。

# VirtualBoxのインストール

「VirtualBox 4.3.22」(2015/02/27最新)を使用した場合```vagrant up```で転けるため旧バージョンを使用します。
以下から「VirtualBox 4.3.12」のインストーラーをダウンロードしてインストールします。

Download_Old_Builds_4_3 – Oracle VM VirtualBox
https://www.virtualbox.org/wiki/Download_Old_Builds_4_3

# Vagrantのインストール

以下からVagrantのインストーラーをダウンロードしてインストールします。

Download Vagrant - Vagrant
https://www.vagrantup.com/downloads.html

# 仮想マシン作成、起動

Windowsのコマンドプロンプトで作業を行います。

## 作成

### 仮想マシンの追加

今回はCentOS6.5を使用します。
Vagrantのコマンドを使用します。

```vagrant box add {name} {url}```

***

{name}
好きな名前をつけます。

{url}
以下を参照。

A list of base boxes for Vagrant - Vagrantbox.es
http://www.vagrantbox.es/

***

今回のコマンドは以下になります。

```> vagrant box add CentOS6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box```

確認します。

```
> vagrant box list
CentOS6.5 (virtualbox, 0)
```

### 仮想マシンを管理するフォルダの作成

好きな名前のルートフォルダを作成します。

```
> mkdir D:\VirtualMachines
```

次に、仮想マシン個別のフォルダを作成します。
{name}で「CentOS6.5」を指定したので同様の名前にします。

```
> mkdir D:\VirtualMachines\CentOS6.5
```

### 仮想マシンの構築

```
> cd D:\VirtualMachines\CentOS6.5
> vagrant init CentOS6.5
```

## 起動

```
> cd D:\VirtualMachines\CentOS6.5
> vagrant up
```

以下起動時のログです。
大体、初回起動時には同様のログが出る思います。

```
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'CentOS6.5'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: CentOS65_default_1425017787630_88820
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if its present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => D:/VirtualMachines/CentOS6.5
```

SSHに接続する際、一旦リトライしていますが、気にしないことにします。

2回目以降、ログに変化がありました。

```
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => D:/VirtualMachines/CentOS6.5
==> default: Machine already provisioned. Run `vagrant provision` or use the `--
provision`
==> default: to force provisioning. Provisioners marked to run always will still
 run.
```

ひとまず仮想マシンが起動している状態になりました。

## 停止

以下のコマンドで停止することができます。

```
> cd D:\VirtualMachines\CentOS6.5
> vagrant halt
==> default: Attempting graceful shutdown of VM...
```

# 開発用パッケージのインストール

ここからの作業は仮想マシンにSSH接続してターミナルで行います。

```
$ sudo yum update
$ sudo yum -y install git gcc make openssl-devel zlib-devel readline* gcc-c++
$ sudo yum -y install nodejs
$ sudo yum -y install sqlite-devel
$ sudo yum -y install libffi-devel
```

# Rubyのインストール

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ . ~/.bash_profile
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install -l
$ rbenv install -v 2.2.0
$ rbenv rehash
$ rbenv global 2.2.0
$ ruby -v
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]
```
# Ruby on Railsのインストール

```
$ gem update --system
$ gem install rails -no-ri --no-rdoc
```

今回は途中で複数のgemがインストールできず、エラーになりました。
以下のようなエラーが表示されます。

```
ERROR:  While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
    no such name (https://api.rubygems.org/quick/Marshal.4.8/loofah-2.0.1.gemspec.rz)
```

```
$ gem install loofah
Successfully installed loofah-2.0.1
Parsing documentation for loofah-2.0.1
Installing ri documentation for loofah-2.0.1
Done installing documentation for loofah after 0 seconds
1 gem installed
```

いろいろと原因はあるとは思います。(詳しくは知りません)
私の場合は個別で入れ直せば問題ありませんでした。
なのでエラーが出たgemを個別で入れました。

その後、```gem install rails -no-ri --no-rdoc```を再度実行します。

```
$ gem install rails -no-ri --no-rdoc
Successfully installed rails-4.2.0
Parsing documentation for rails-4.2.0
Done installing documentation for rails after 0 seconds
1 gem installed

$ rails -v
Rails 4.2.0
```

Bundlerも入れておきます。

```
$ gem install bundler
Successfully installed bundler-1.8.3
Parsing documentation for bundler-1.8.3
Installing ri documentation for bundler-1.8.3
Done installing documentation for bundler after 2 seconds
1 gem installed
```

エラーが出て大変でしたが、Railsをインストールし終えました。

# サンプルアプリの作成

サンプルアプリを作成しましょう。
作成するディレクトリですが、Vagrantではホストマシンとの共有のディレクトリが用意されています。
その中にサンプルアプリを作成しましょう。

```
$ cd vagrant
$ rails new sample
$ cd sample
```

scaffoldした際に以下のエラーが発生しました。
先ほどまで通っていた```rails```コマンドすら通りません。


```
$ rails g scaffold List name:string
Could not find gem 'sqlite3 (>= 0) ruby' in the gems available on this machine.
Run `bundle install` to install missing gems.
```

sqlite3が見つからないというエラーになります。
言われた通りにインストールします。
他にも複数のプラグインが見つからないというエラーが出ました。
　※別の仮想マシンで試した時にも同じエラーが出ていましたが、数が違いました。タイミングの問題なのでしょうか？
全てインストールしていきます。
再度scaffoldします。

```
$ rails g scaffold List name:string
$ rake db:migrate
```

サンプルアプリの作成が完了しました。

# サンプルアプリの表示

次に、ホストマシンから仮想マシンに接続できるようにします。
Railsでは3000ポートを使用しているのでVagrantの設定でホストマシンから接続できるように設定ファイルを書き換えます。
ホストマシンで作業します。
Vagrantで作成したフォルダ「D:\VirtualMachines\CentOS6.5」にある「Vagrantfile」を編集します。

```
  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # config.vm.network "forwarded_port", guest: 80, host: 8080
+ config.vm.network "forwarded_port", guest: 3000, host: 3000
```

Windowsのコマンドプロンプトで以下のコマンドを実行して設定を読み込みます。

```
> vagrant reload
```

再接続してRailsサーバを起動しましょう。

```
$ cd /vagrant/sample
$ rails s -b 0.0.0.0
```

起動コマンドにオプションが設定されていますが、これは```rails s```だとlocalhostからの接続のみを受け付けるためホストマシンから接続できません。any指定にすることでホストマシンから接続できるようになります。

あとはホストマシンのブラウザから以下にアクセスします。
```
http://localhost:3000/lists
```