Motomichi Works Blog

その日学習したことについて書いている日記です。誰かの役に立ったらそれはそれで嬉しいです。

railsその0002 vagrant+rails5の環境でmodelやcontrollerのファイルを編集しても反映されない問題を解決する

参考にさせて頂いたページ

vagrantrsyncのエラーについて

vagrant + rails のときに起こる問題について

vagrant_1.8.4を使用していたときのこと

このときの環境(インストーラーなど)

ホストマシン環境

ゲストマシン環境

rsyncが無いのでMSYS2をインストールしてpacmanrsyncをインストールする

Vagrantfileの中で type: "rsync",を設定するにはrsyncをインストールする必要があり、

これまで git for windows の Git BASHvagrant を使ったりしていましたが、このままだと都合が悪いので、

表題の問題を解決するためにMSYS2をインストールしたり以下のことをしました。

MSYS2については別途「Windows10にmsys2をインストールして使ってみる - Motomichi Works Blog」に今回の件以外のことも含めて書きました。

Vagrantfileのconfig.vm.synced_folderの設定をする

例として以下の通りですが、同期するディレクトリのパスはご自分の環境に合わせて読み替えてください。

config.vm.synced_folder "./my_app", "/var/www/rails_project/my_app",
  type: "rsync",
  rsync__args: %w(--verbose --archive --delete -z --copy-links --times),
  rsync__exclude: %w(.git/ log/ tmp/ vendor/)

vagrant upしてみるとエラー

以下のようなエラーが出ました。同期せずに止まっているようなので仮想環境内のディレクトリには何もありません。

There was an error when attempting to rsync a synced folder.
Please inspect the error message below for more info.

Host path: /c/Users/motomichi/Desktop/all/git_repos_all/github/MotomichiWorks/rails_practice_0001/my_app/
Guest path: /var/www/rails_project/my_app

Command: "rsync" "--verbose" "--archive" "--delete" "-z" "--copy-links" "--times" "--chmod=ugo=rwX" "--no-perms" "--no-owner" "--no-group" "--rsync-path" "sudo rsync" "-e" "ssh -p 2222 -o ControlMaster=auto -o ControlPath=C:/Users/Public/Documents/Wondershare/CreatorTemp/ssh.926 -o ControlPersist=10m -o StrictHostKeyChecking=no -o IdentitiesOnly=true -o UserKnownHostsFile=/dev/null -i 'C:/Users/motomichi/.vagrant.d/boxes/centos67box-20170505/0/virtualbox/vagrant_private_key'" "--exclude" ".vagrant/" "--exclude" ".git/" "--exclude" "log/" "--exclude" "tmp/" "--exclude" "vendor/" "/c/Users/motomichi/Desktop/all/git_repos_all/github/MotomichiWorks/rails_practice_0001/my_app/" "vagrant@127.0.0.1:/var/www/rails_project/my_app"

Error: This rsync lacks old-style --compress due to its external zlib.  Try -zz.

Continuing without compression.

Warning: Permanently added '[127.0.0.1]:2222' (RSA) to the list of known hosts.
mux_client_request_session: read from master failed: Connection reset by peer
Failed to connect to new control master
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.2]

これに関しては、「VirtualBox - ローカルとvargrentをrsyncしたくvagrantfileを編集したところ、vagrant up中に以下のエラーメッセージが発生しました。何が原因かアドバイスを頂けないでしょうか?(36200)|teratail」を参考にさせて頂いて解決しました。

私の環境では以下のファイルを編集しました。

C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.8.4\plugins\synced_folders\rsync\helper.rb

以下の3行をコメントアウトしました。

          "-o ControlMaster=auto " +
          "-o ControlPath=#{controlpath} " +
          "-o ControlPersist=10m " +

念のためいつでも元に戻せるようにしておくのが良さそうですね。

ホストマシンのmodelやcontrollerを編集しても仮想環境内に反映されない問題を解決する

まず vagrant reload をすると仮想環境内に同期はされるようになりました。

まだこれだけではrailsサーバーを一度止めてから、rails sしなおさないと編集内容が反映されません。

Rails developmentモードなのにコードの変更が反映されない – KeruuWeb」を参考にさせて頂いて解決しました。

vagrant reload

をしたあとで、一度以下を実行します。

vagrant rsync

次に以下を実行するとリアルタイムに同期されるようになります。

vagrant rsync-auto

このウィンドウはそのままにして、別ウィンドウでMSYS2を起動して、

vagrant ssh

railsのあるディレクトリでいつも通り

rails s

して確認すると解決されていました。

終了するときは、

ctrl + c で rsync-auto を止めて、いつも通り vagrant halt で止めます。

vagrant_1.9.7を使用していたときのこと

このときの環境(インストーラーなど)

ホストマシン環境

ゲストマシン環境

rsync-autoしたけど同期できないときのメッセージ

おおよそはvagrant_1.8.4を使用していたときと同じような手順を実行して、rsync-autoを実行しました。

$ vagrant rsync-auto

以下のように表示されました。

==> default: Not syncing C:/Users/motomichi/Desktop/all/git_repos_all/github/MotomichiWorks/rails_practice_0001/my_app as it is not part of the current workin
g directory.
==> default: Doing an initial rsync...
==> default: Rsyncing folder: /cygdrive/c/Users/motomichi/Desktop/all/git_repos_all/github/MotomichiWorks/rails_practice_0001/ => /vagrant
==> default: Watching: C:/Users/motomichi/Desktop/all/git_repos_all/github/MotomichiWorks/rails_practice_0001
==> default: Rsyncing folder: /cygdrive/c/Users/motomichi/Desktop/all/git_repos_all/github/MotomichiWorks/rails_practice_0001/ => /vagrant

以前どうだったか覚えていないのですが、任意で指定したパスはNot syncingと表示されてしまい同期されませんでした。

rsync-autoで同期できない問題を回避

任意でディレクトリ指定するのを諦めて、デフォルトの.と/vagrantだけ指定することにして、シンボリックリンクを作成しました。

Vagrantfileを以下のように記述しました。

  config.vm.synced_folder ".", "/vagrant",
    type: "rsync",
    rsync__args: %w(--verbose --archive --delete -z --copy-links --times),
    rsync__exclude: %w(.git/ log/ tmp/ vendor/)

私の場合のディレクトリパスでいうと以下のようにコマンドを実行しました。

まず仮想環境内に残っていたファイルを削除します。

$ vagrant ssh
$ su
(パスワード入力)vagrant
# cd /var/www/rails_project/
# rm -rf my_app/
exit

シンボリックリンクを作成します。

$ ln -s /vagrant/my_app

仮想環境内でここまでやったら、以下のコマンドを実行します。

$ vagrant rsync
$ vagrant rsync-auto