web-dev-qa-db-ja.com

Vagrant共有フォルダーとファイル変更イベント

Vagrantを介してアクセスしているubuntu仮想マシンがあります。私のホスト(Mac OSX)には、いくつかのファイルを含むフォルダーがあり、仮想マシンと共有しています。その仮想マシンでは、 guard を使用してファイルの変更を監視し、それらのファイルのいずれかが変更された場合に何らかのアクションを実行します。

ガードを適切に設定し、仮想マシン内から共有ファイルを変更すると、問題なく動作し、適切なスクリプトを実行します。しかし、ホストマシンから共有ファイルを変更しようとすると、このファイル変更イベントが伝播せず、ガードが反応しません。

これは私のvagrant共有フォルダがどのように見えるかです(かなり通常のもの)

local_config.vm.share_folder "app", "/var/www/app/current", "../app"

NFS共有(:nfs => true)しかし、それは助けにはなりませんでした。

ホストから仮想マシンにファイル変更イベントを伝播させる方法はありますか?または、これはVagrant/VirtualBoxの性質のものですか?

UPDATE:

もう少し試してから、 ZenTest gemをインストールしました。これには、ファイル変更イベントに関する同様の機能を可能にする自動テストツールが含まれています。

仮想マシンで自動テストを実行し、ホストマシンからファイルを変更すると、これらの変更が伝播され、autotestが反応します

これに基づいて、ファイル変更イベントの伝播は警戒の問題であり、浮浪者や仮想ボックスではないようです。

ただし、ガードと自動テストの実装の違いについては調べていません。

これで、仮想マシンのホストからファイル変更イベントをキャッチできることがわかりました。ガードを使用してこれを達成する方法について誰かが何か考えがありますか?DSLと一般的な使いやすさのため、私はガードがもっと好きです。

15
rdamborsky

根本的な原因は、VirtualBoxがホスト上のファイル変更イベントをVMにカスケードしないことです。 Guard(Linux上)は、inotifyイベントを介して通知を受け取ることを期待しています。代わりに、guard -pを使用してイベントのガードポーリングを行うことができますが、これによりCPUが最大になる可能性があるため、guard -p -l 10を使用してポーリングを抑制できます。

guard help startから:

  -l, [--latency=Overwrite Listen's default latency]
  -p, [--force-polling=Force usage of the Listen polling listener]

http://www.softr.li/blog/2012/07/21/running-guard-over-vagrant

11

私はこれが古い質問であることを知っていますが、ここに最新の答えがあります:

- ガード -o/--listen-onオプションのドキュメント

クイックリファレンスとしてここに貼り付けます。

-o/--listen-on option

Use Listen's network functionality to receive file change events from the
network. This is most useful for virtual machines (e.g. Vagrant) which have
problems firing native filesystem events on the guest OS.

Suggested use:

On the Host OS, you need to listen to filesystem events and forward them to
your VM using the listen script:

    $ listen -f 127.0.0.1:4000

Remember to configure your VM to forward the appropriate ports, e.g.
in Vagrantfile:

    config.vm.network :forwarded_port, guest: 4000, Host: 4000

Then, on your guest OS, listen to the network events but ensure you
specify the Host path:

    $ bundle exec guard -o '10.0.2.2:4000' -w '/projects/myproject'
4
Adam Eberlin

誰かがこの問題に遭遇し、ガードがまだ機能しない場合...

私は watchr を使用することになりました。ガードの代替手段です。ホストからゲストマシンへのイベントの伝播はウォッチャーで問題なく動作します。また、自動テストよりも柔軟性があります。

1
rdamborsky