Folder yang dibagikan Vagrant dan acara perubahan file

14

Saya memiliki mesin virtual ubuntu yang saya akses melalui Vagrant. Di host saya (Mac OSX), ada folder dengan beberapa file, yang saya bagikan ke mesin virtual. Di mesin virtual itu, saya ingin menggunakan penjaga untuk melihat perubahan file dan melakukan beberapa tindakan jika ada file yang berubah.

Saya mengatur pelindung dengan benar, dan ketika mengubah file bersama dari dalam mesin virtual, itu berfungsi dengan baik dan menjalankan skrip yang sesuai. Tetapi, jika saya mencoba mengubah file yang dibagikan dari mesin host saya, acara perubahan file ini tidak menyebar dan penjaga tidak bereaksi.

Beginilah tampilan folder vagrant saya (hal yang biasa)

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

Saya bahkan mencoba menggunakan NFS sharing ( :nfs => true) tetapi tidak membantu.

Apakah ada cara untuk membuat perubahan file yang menyebar acara dari host ke mesin virtual? Atau apakah ini sesuatu yang bersifat Vagrant / VirtualBox?

MEMPERBARUI:

Setelah beberapa percobaan lagi, saya menginstal permata ZenTest , yang berisi alat autotest yang memungkinkan fungsionalitas yang sama mengenai peristiwa perubahan file.

Saat menjalankan autotest di mesin virtual dan mengubah file dari mesin host saya, perubahan ini diperbanyak dan autotest bereaksi .

Berdasarkan ini, tampaknya bahwa perambatan acara perubahan file adalah masalah penjaga, bukan gelandangan atau kotak virtual.

Saya belum melihat perbedaan implementasi antara penjaga dan autotest.

Sekarang saya tahu adalah mungkin untuk menangkap peristiwa perubahan file dari host di mesin virtual. Adakah yang tahu bagaimana cara mencapai ini menggunakan penjaga? Saya lebih suka menjaga karena DSL dan kegunaan generik.

rdamborsky
sumber

Jawaban:

10

Akar penyebabnya adalah bahwa VirtualBox tidak mengubah kejadian perubahan file pada host ke VM. Guard (di Linux) berharap untuk menerima notifikasi melalui acara yang tidak resmi. Alih-alih, Anda dapat memiliki polling pengamanan untuk acara-acara bersama guard -p, tetapi ini dapat menyebabkan CPU Anda memaksimalkan, sehingga Anda dapat menekan kembali polling guard -p -l 10.

Dari 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

Gabe Martin-Dempesy
sumber
Terima kasih Gabe, saya meninggalkan penjaga untuk menonton beberapa waktu yang lalu. Tetap saja, jawaban Anda sangat berharga untuk dipahami.
rdamborsky
4

Saya tahu ini adalah pertanyaan yang lebih lama, tetapi ini adalah jawaban yang lebih terkini:

-o/--listen-onDokumentasi opsi penjaga

Disisipkan di sini untuk referensi cepat:

-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'
Adam Eberlin
sumber
1

Jika ada yang mengalami masalah ini dan penjaga masih tidak berfungsi ...

Saya akhirnya menggunakan watchr . Ini adalah alternatif untuk menjaga. Perambatan acara dari host ke mesin tamu berfungsi baik di Watchr. Ini juga lebih fleksibel daripada autotest.

rdamborsky
sumber
Events propagation from host to guest machine works ok in watchr.Bagaimana? Apakah menggunakan polling? Jika VirtualBox tidak menyebarkan acara, bagaimana ia bisa tahu kapan file telah berubah?
Nateowami