Vagrant の Rsync Synced Folders を設定して、ホスト側とゲスト側のディレクトリを同期する
以下の「Vagrant と VirtualBox で自由に汚せるローカル環境を構築する」と「Vagrant と VirtualBox 作ったローカル環境に Ruby をインストールする」の続きです。
Vagrant では Vagrantfile のあるディレクトリと Vagrant 上の /vagrant
が同期されています。
Vagrant 上で触りたいファイルなどがあったら、Vagrantfile のあるディレクトリにコピー(または、移動)しておく必要があるのですが、Vagrantfile のあるディクレトリ以外で作業していた場合、ファイルに手を加えるたびにこれをやるのは結構めんどくさい!
(もちろん、コピーや移動しなくても、Vagrantfile と同じディレクトリで作業したり、最初から Vagrant 上で作業するという方法もありますが。。)
なので、Vagrant の Rsync Synced Folders を使って、ホスト(Mac や Windows などのローカル)上の特定のディレクトリに変更があったら、自動でゲスト(Vagrant)上のディレクトリに同期されるようにしたいと思います。
VagrantFile の設定
VagrantFile で config.vm.synced_folder がコメントアウトされている箇所があるので、以下のとおり、設定を追加します。
Vagrant.configure("2") do |config| config.vm.synced_folder "~/vagrant", "/home/vagrant", type: "rsync", rsync__exclude: [".git/"] end
config.vm.synced_folder の後に "ホスト側のパス"、"ゲスト側のパス" の順、type に "rsync" を指定すれば、ディレクトリの同期ができます。
(上記の設定例だと、Mac 上の ~/vagrant
に変更が入ったら、Vagrant 上の /home/vagrant
に同期しますよ、という意味になります)
rsync__exclude
はオプションなので、指定してもしなくてもどちらでも OK!
設定したい場合は以下を参考にしつつ、お好みでどうぞー。
(ちなみに rsync__exclude
は同期の対象外にしたいものを指定できるオプションです。上記の設定例だと、~/vagrant/.git/
内は /home/vagrant
に同期されなくなります)
オプションに詳細についてはこちら↓
- RSync - Synced Folders - Vagrant by HashiCorp(公式ドキュメント)
https://www.vagrantup.com/docs/synced-folders/rsync.html
ディレクトリの同期
vagrant up すると、そのタイミングでホスト側とゲスト側のディレクトリが同期されます。
$ vagrant up
この後、同期しようとするたびに毎回 vagrant up するのは大変なので、ホスト側のディレクトリに変更が入ったら、自動でゲスト側のディレクトリにも同期するために、続けて以下のコマンドを実行します。
$ vagrant rsync-auto
たったこれだけでホスト上のファイルに何か変更が入るたびにゲスト上にも反映されるので、とっても便利ー!
参考
ちなみに、設定を行うにあたり、以下を参考にさせていただきました。
Vagrantのsynced_folderはrsyncで
http://lealog.hateblo.jp/entry/2016/04/16/145107
Vagrant RSync でローカル開発環境を作る際に注意すべきこと
http://blog.hotolab.net/entry/vagrant_rsync
Vagrantでゲストとホストのフォルダを共有する
http://koltatt.net/programing/vagrant_dirsync/
2017/12/19 追記:
type に rsync を指定した場合、ホストからゲストの一方向しか同期されないことが判明。。
ホスト側でしか作業しない(ホスト側を正としたい)場合はこれでもいいですが、ゲスト側で行った変更をホスト側にも反映したい(双方向で同期したい)場合は、Vagrantfile を以下のようにします。
Vagrant.configure("2") do |config| config.vm.synced_folder "~/vagrant", "/home/vagrant" end
こうすると、vagrant rsync-auto
しなくても自動でホスト側とゲスト側が双方向同期に!