Windows 8.1 + VagrantでRails4開発環境を構築する

RailsはおろかRubyもほぼ開発経験なしで、そもそも無職なんですが、なぜかRails4開発案件の話が来ているため、ここ数日ほどRailsの学習/開発環境を用意したりしております。

基本方針

使うもの

仮想マシン関連
  • Vagrant 1.3
    • 最近流行ってるらしい、VirtualBoxやらをラップした開発環境構築・管理ツール
  • vagrant-vbox-snapshot
    • Vagrantで作成した仮想マシンイメージのスナップショットを管理(VirtualBoxのスナップショット機能のラッパーコマンド)
  • Ubuntu 12.04
Rails関連
  • Ruby 2.0.0-p247
  • Rails 4.0.0
  • MySQL 5.5
  • SQLite3
  • rbenv
    • 複数バージョンのRubyを管理(同一マシンにインストール・切り替え)するツール
  • Bundler
    • Gem管理ツール
Windowsホスト関連
  • PuTTY
    • おなじみのWindows用SSHクライアント
    • 好みの問題でiceiv+puttyを使う
  • win-sshfs
    • SSH(SFTP)をWindowsのドライブとしてマウントできる
    • これを使ってWindows側から仮想マシン上のコードを編集する
  • HeidiSQL
    • Windows用のMySQLクライアント
  • Chocolatey
    • Windows用のapt-getとかyumとかみたいなツール

環境構築

Chocolateyのインストール
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin - See more at: http://chocolatey.org/#sthash.9ZRAqnDV.dpuf
Vagrantのインストール

もしかしたら、VirtualBoxインストール後にいったん再起動した方がいいかもしれない。


Windows 8.1にVirtualBoxをインストールするとシャットダウンやスリープが失敗する - terurouメモというバグがあるので、Windows 8の場合はVirtualBoxはChocolateyでインストールせずに、手動インストールした方が良さそう。

cinst virtualbox
cinst vagrant
vagrant plugin install vagrant-vbox-snapshot
Windowsホスト関連ツールのインストール

iceiv+puttyとwin-sshfsは勝手にChocolateyパッケージ化した。

cinst putty-d2ddw 
cinst win-sshfs
cinst HeidiSQL 
ベースとなる仮想マシンイメージのダウンロード

Vagrantではベースとなる仮想マシンイメージを元に、プロジェクト固有の仮想マシンイメージを作成するという流れになる。とりあえずここでは、ほぼ真っ新に近いUbuntu 12.04イメージを使う。

vagrant box add ubuntu12_04 http://files.vagrantup.com/precise64.box

ちなみにこのイメージは一度ローカルにダウンロードしてしまえば使いまわしが可能。

仮想マシンの作成+初期設定

rbenvをシステムワイドにインストールするケースの手順。

まずは仮想マシンの作成から。

mkdir foo
cd foo
vagrant init ubuntu12_04

これだけで仮想マシンが作成される。続けて仮想マシンの設定を変更する。Vagrantfileを適当なエディタで開いて、以下を追加する。

  config.vm.network :forwarded_port, guest: 3000, host: 3000
  config.vm.provider :virtualbox do |vb|
    vb.customize [
      "modifyvm", :id,
      "--memory", "1024",
    ]
  end

これで仮想メモリを1GBに変更して、VirtualBoxのhost only adapterのNATテーブルRailshttpdポートを解放したことになる。続けて、仮想マシンを立ち上げる。

vagrant up

仮想マシンが立ち上がったら、PuTTY仮想マシンに接続する。

  • host : 127.0.0.1
  • port : 2222
  • user : vagrant
  • 秘密鍵 : %UserProfile%\.vagrant.d\insecure_private_key(puttygenでPuTTY用の鍵に変換しておく)

SSH接続できたら、メモリを増設したので、念のためスワップを追加しておく。

sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo chmod 0600 /swap
sudo mkswap /swap
sudo swapon /swap

インストール済みのパッケージも更新しておく。

sudo apt-get update
sudo apt-get upgrade

apt-getでインストール可能なツール群をインストール。

sudo apt-get install build-essential sqlite3 libsqlite3-dev mysql-server git


追記: MySQLドライバが不足してた。

sudo apt-get install libmysql-ruby libmysqlclient-dev

sudoの設定変更。

sudo visudo -f /etc/sudoers.d/base
Defaults !secure_path
Defaults env_keep += "PATH RBENV_ROOT"

この時点でシェルの再起動が必要かも。

rbenvのインストール。

cd /opt/rbenv
sudo mkdir plugins
cd plugins
sudo git clone https://github.com/sstephenson/ruby-build.git

環境変数の登録。

sudo nano /etc/profile.d/rbenv.sh
export RBENV_ROOT="/opt/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

rbenvの初期セットアップ。

sudo /opt/rbenv/rbenv init -

パスを登録したので、ここでシェルの再起動が必要になるはず。

rbenv内にRuby 2.0.0-p247をインストール。

sudo rbenv install 2.0.0-p247

デフォルトのRubyランタイムバージョンを2.0.0に変更。

sudo rbenv global 2.0.0-p247

rbenvで正常に切り替わったか確認。

ruby -v
which gem

2.0.0-p247にうまく切り替わってなければ、シェルを再起動してみてから確認する。

最後にBundlerのインストール。

sudo gem install bundler --no-rdoc --no-ri
sudo rbenv rehash

Railsプロジェクトの作成

mkdir foo
cd foo
bundle init
nano Gemfile

Gemfileに以下を追加。

gem "rails", '~> 4.0.0'

追加したら、以下のコマンドでRailsのgemをインストール。

bundle install --path vendor/bundle

Railsプロジェクトの作成。途中でGemfileを上書きして良いか確認されるので、上書きする。

bundle exec rails new .

httpd起動。

bundle exec rails s

httpd起動時に

`autodetect': Could not find a JavaScript runtime.

のようなメッセージが表示されて起動に失敗した場合(というか失敗すると思う)は、Gemfileに以下を追加してから bundle install してから、もう一回httpdを起動する。

gem 'execjs'
gem 'therubyracer'

Windows側から http://127.0.0.1:3000/ にアクセスできれば、とりあえずOK。

RailsからMySQLにつなぐ場合

Gemfileに以下を追加して、bundle install。

gem 'mysql2'

config/database.yamlMySQL接続情報を記述。

development:
  adapter: mysql2
  encoding: utf8
  database: ****
  pool: 5
  timeout: 5000
  username: ****
  password: ****
  host: localhost
  port: 3306

win-sshfsとHeidiSQLの接続確認

win-sshfs

タスクトレイにwin-sshfsが常駐しているはずなので、右クリック→Show Managerして、以下のように設定。

  • Host : 127.0.0.1
  • Port : 2222
  • Username : vagrant
  • Authentication method : PrivateKey
  • PrivateKey : %UserProfile%\.vagrant.d\insecure_private_key
HeidiSQL

NATからはうまく接続ができなかったのでSSHトンネルで接続。

  • 設定タブ
    • ネットワーク種別 : MySQL(SSH tunnel)
    • ホスト名 : 127.0.0.1
    • ユーザ : root
    • パスワード : インストール時に設定したもの
    • ポート : 3306
  • SSHトンネルタブ
    • plink.exeの場所 : plinkだと動かかなかったので、plinkwを指定する
    • SSHホスト + ポート : 127.0.0.1, 2222
    • ユーザ名 : vagrant
    • プライベートキー : %UserProfile%\.vagrant.d\insecure_private_key