読者です 読者をやめる 読者になる 読者になる

みかづきメモ

学習したことのメモとか、日記とか、備忘録。

Windows + Vagrant + Rails の比較的快適な環境を作る

Vagrant

WindowsRuby on Railsの開発環境を作るメモです。
正確には、作った上でそれを快適にするまでのメモです。


環境

ホスト
Windows 8.1
・ Virtual Box 5.0.0
Vagrant 1.7.4


ゲスト
CentOS 6.5


基本的な構築はこちらの記事が分かり易いので、それを参考に。

qiita.com

上の記事とほぼ同じ設定として進めていきます。

基本的にはこのままでもなんの問題もないのですが、
Rails Serverがめちゃくちゃ重いです。
さすがに我慢の限界だったので、とりあえず改善していきます。


[Vagrant Rails 遅い]で検索をかけると、NFSを使おうという記事がヒットします。
しかしながら、WindowsNFSは使えないとのことなので、別の方法を探ります。


んで見つかったのがrsyncを使うというもの。

VagrantFileを編集します。

config.vm.synced_folder ".", "/vagrant", type:"rsync", rsync__exclude: [".git/"]

rsync__excludeには同期対象外のディレクトリとか指定しておきます。
すでに.vagrant/は追加されているので、書く必要はない。

なお、Windowsにはrsyncコマンドは存在しないので、cygwinから導入しておきます。
このとき、cygwinのインストールした場所へPATHを通しておくこと。


PATHを通したら次はシンボリックリンクを作成します。
cygwin Terminalから

cd /
ln -s /cygdrive/c

としておきます。
そしてvagrant upで起動し、vagrant rsync-autoで自動で同期してくれます。

ハマった

上のまますんなり行くこともあるのですが、私の場合はいくつかエラーが出て死にました。

UndefinedConversionError

C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/util/io.rb:32:in 'encode': "\x83\xE3" from Windows-31J to UTF-8 (Encoding::UndefinedConversionError)

日本語関連のエラーっぽい。
しかしながら、ディレクトリ名にもファイル名にも日本語文字を使った覚えがないし、
何故出ているのかわからない。

とりあえずの対策として、io.rbの32行目を書き換えた。

data << io.readpartial(READ_CHUNK_SIZE).force_encoding("UTF-8")

これで正常に動く。

ArgumentError

C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.4/plugins/providers/virtualbox/driver/base.rb:387:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)

コンソールをSJISにすれば治ると聴いたけど、もともとSJISだった。
これもしかたがないので握りつぶす。

r.stdout.force_encoding('ASCII-8BIT').gsub("\r\n", "\n")

これで正常に動くようになった。
ちなみにPC再起動した後スクリプトを戻しても動いたので、本当に意味がわからない。