Vagabundos eventos de carpeta compartida y cambio de archivo

14

Tengo una máquina virtual ubuntu a la que accedo a través de Vagrant. En mi host (Mac OSX), hay una carpeta con un par de archivos que comparto en la máquina virtual. En esa máquina virtual, quiero usar guard para vigilar los cambios de archivos y realizar alguna acción si alguno de esos archivos cambia.

Configuré guardia correctamente, y cuando cambio el archivo compartido desde la máquina virtual, funciona bien y ejecuta los scripts apropiados. Pero, si trato de cambiar el archivo compartido desde mi máquina host, este evento de cambio de archivo no se propaga y la protección no reacciona.

Así es como se ve mi carpeta compartida vagabunda (cosas bastante habituales)

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

Incluso intenté usar NFS sharing ( :nfs => true) pero no me ayudó.

¿Hay alguna forma de hacer que los eventos de cambios de archivos se propaguen desde el host a la máquina virtual? ¿O es algo de naturaleza Vagrant / VirtualBox?

ACTUALIZAR:

Después de algunas pruebas más, instalé ZenTest gem, que contiene la herramienta de prueba automática que permite una funcionalidad similar con respecto a los eventos de cambio de archivo.

Al ejecutar la prueba automática en la máquina virtual y cambiar los archivos desde mi máquina host, estos cambios se propagan y la prueba automática reacciona .

En base a esto, parece que la propagación del evento de cambio de archivo es una cuestión de protección, no vagabundo o caja virtual.

Sin embargo, no he examinado las diferencias de implementación entre guard y autotest.

Ahora sé que es posible detectar eventos de cambio de archivo desde el host en la máquina virtual. ¿Alguien tiene alguna idea sobre cómo lograr esto usando guardia? Me gusta más la guardia debido a su DSL y usabilidad genérica.

rdamborsky
fuente

Respuestas:

10

La causa raíz es que VirtualBox no conecta en cascada los eventos de cambio de archivo en el host a la VM. Guard (en Linux) espera recibir notificaciones a través de eventos inotify. En cambio, puede tener una encuesta de guardia para eventos con guard -p, pero esto puede llevar a que su CPU se agote al máximo, por lo que puede reducir el sondeo nuevamente guard -p -l 10.

De 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
fuente
Gracias Gabe, dejé la guardia como vigilante hace algún tiempo. Aún así, su respuesta es valiosa para comprender.
rdamborsky
4

Sé que esta es una pregunta anterior, pero aquí hay una respuesta más actualizada:

-o/--listen-onDocumentación de la opción de guardia

Pegado aquí para referencia rápida:

-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
fuente
1

Si alguien se encuentra con este problema y la protección aún no funciona ...

Terminé usando watchr . Es una alternativa a la guardia. La propagación de eventos desde el host a la máquina invitada funciona bien en watchr. También es más flexible que el autotest.

rdamborsky
fuente
Events propagation from host to guest machine works ok in watchr.¿Cómo? ¿Utiliza encuestas? Si VirtualBox no propaga los eventos, ¿cómo puede saber cuándo ha cambiado un archivo?
Nateowami