Sublime Text3で書いたファイルをVagrant仮想環境に同期させる

うちのPython環境はVagrantで作ったゲストOSの中にある。
一方でエディタはSublime Text3を使っている。flake8で補完が効いてらくらく。
なので、ホストOSでSublime Text3を使って書いたファイルを、手間なくゲストOSにも同期させたいと思っていた。

Sublime Text3にはSFTPパッケージがあるので、最初はそれを使おうと思っていたが、それよりもVagrantで共有フォルダの設定をしてしまった方が楽だと気づいた。SFTPパッケージは$30かかるし。

rsyncを使う

ファイルの共有を楽にするためには、vagrantrsync機能を使うのがおすすめ。前提としてVagrantのバージョンは1.5以上が必要。
これを使うと、 vagrant rsyncコマンドを打つだけで同期ができる。
さらに、 vagrant rsync-autoとすれば、共有フォルダを監視してくれて、ファイル更新のたびに自動で同期される。

ちなみに、vagrant rsyncが有効なのは、ホストOS→ゲストOSという流れでファイル共有をするときのみ。
その逆をしたいときは、Vagrantの外部プラグインを使う必要がある。例えばvagrant-rsync-backなどがある。

共有フォルダの設定をする

Vagrantfileの中に設定を書き加えればよい。

www.vagrantup.com

このとき、rsyncを使うために、オプションとしてtype: "rsync"とする必要がある。 設定の例はこんな感じ。

Vagrant.configure("2") do |config|
  # other config here

config.vm.synced_folder "/Users/Udomomo/python_project", "/home/vagrant/python_project/",
   type: "rsync",
   owner: "vagrant",
   group: "vagrant"

end

【17/10/15 追記】 上記だけでは足りなかった。以下のようにしなければならない。

config.vm.synced_folder "/Users/Udomomo/python_project", "/home/vagrant/python_project/",
   type: "rsync",
   owner: "vagrant",
   group: "vagrant"
   rsync__exclude: [".git", ".gitignore", "tmp", "log", "cache"],
   rsync__chown: false

rsync__excludeは、ゲストOS上で同期の対象外とするファイルやディレクトリを指定する。.git.gitignorelogcacheなどを設定するとよい。
これが必要なのは、rsyncによる同期をするとホストOS上にないファイルは全て削除されてしまうから。ゲストOS側でgitレポジトリを作った後に同期をしたら、レポジトリが消えてしまうという痛い目に遭った。

また、rsync__chownは、rsyncによってゲストOS側のファイルのオーナーやグループ名などが変わらないようにするための設定。v1.6.3から追加されたとのこと。
【追記終】

後はVagrantを再起動させれば、設定が完了する。
vagrant rsync-autoとしておけば、ホストOSのUsers/Udomomo/python_project配下で更新されたファイルが、ゲストOSの/home/vagrant/python_project/配下に自動的に同期される。

ちなみにこの設定だが、複数個書くこともできる。新しいプロジェクトが始まるごとにVagrantfileに書き足し、不要なものを消せばよい。
共有フォルダを一つしか設定できないと、毎回そこに行ってファイルを取ってこないといけないので、複数個設定できるのは本当に助かる...。