Vagrant condivisi eventi di modifica di cartelle e file


14

Ho una macchina virtuale Ubuntu a cui accedo tramite Vagrant. Sul mio host (Mac OSX), c'è una cartella con un paio di file, che condivido con la macchina virtuale. In quella macchina virtuale, voglio usare guard per controllare le modifiche ai file ed eseguire alcune azioni se qualcuno di questi file cambia.

Ho impostato correttamente la protezione e quando si cambia il file condiviso dall'interno della macchina virtuale, funziona bene ed esegue script appropriati. Ma, se provo a cambiare il file condiviso dal mio computer host, questo evento di cambio file non si propaga e guard non reagisce.

Ecco come appare la mia cartella condivisa del vagabondo (roba abbastanza normale)

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

Ho anche provato a utilizzare la condivisione NFS ( :nfs => true) ma non mi è stato di aiuto.

Esiste un modo per far propagare gli eventi di modifica dei file dall'host alla macchina virtuale? O è qualcosa della natura di Vagrant / VirtualBox?

AGGIORNARE:

Dopo alcune prove, ho installato ZenTest gem, che contiene uno strumento di autotest che consente funzionalità simili per quanto riguarda gli eventi di modifica dei file.

Durante l'esecuzione dell'autotest nella macchina virtuale e la modifica dei file dalla mia macchina host, queste modifiche vengono propagate e l' autotest reagisce .

Sulla base di questo, sembra che la propagazione degli eventi di modifica del file sia un problema di guardia, non vagabondo o virtuale.

Non ho esaminato le differenze di implementazione tra guard e autotest.

Ora so che è possibile rilevare eventi di modifica dei file dall'host nella macchina virtuale. Qualcuno ha qualche idea su come raggiungere questo obiettivo utilizzando Guard? Mi piace proteggere di più a causa della sua DSL e della sua usabilità generica.

Risposte:


10

La causa principale è che VirtualBox non collega in cascata gli eventi di modifica dei file sull'host alla VM. Guard (su Linux) si aspetta di ricevere notifiche tramite eventi inotify. Invece, puoi avere il polling di guardia per gli eventi con guard -p, ma questo può portare al massimo della CPU, quindi puoi rallentare il polling con guard -p -l 10.

Da 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


Grazie Gabe, ho lasciato la guardia per watchr qualche tempo fa. Tuttavia, la tua risposta è preziosa per la comprensione.
rdamborsky,

4

So che questa è una domanda più vecchia, ma ecco una risposta più aggiornata:

-o/--listen-onDocumentazione delle opzioni di guardia

Incollato qui per una rapida consultazione:

-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'

1

Se qualcuno riscontra questo problema e la protezione continua a non funzionare ...

Ho finito per usare watchr . È un'alternativa alla guardia. La propagazione degli eventi dall'host alla macchina ospite funziona bene in watchr. È anche più flessibile dell'autotest.


Events propagation from host to guest machine works ok in watchr.Come? Usa il polling? Se VirtualBox non sta propagando gli eventi, come può sapere quando un file è cambiato?
Nateowami,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.