Ereignisse zum Ändern von freigegebenen Ordnern und Dateien

14

Ich besitze eine virtuelle Ubuntu-Maschine, auf die ich über Vagrant zugreifen kann. Auf meinem Host (Mac OS X) befindet sich ein Ordner mit einigen Dateien, die ich für die virtuelle Maschine freigebe. In dieser virtuellen Maschine möchte ich mit guard nach Dateiänderungen suchen und eine Aktion ausführen, wenn sich eine dieser Dateien ändert.

Ich habe guard richtig eingerichtet und beim Ändern der freigegebenen Datei in der virtuellen Maschine funktioniert es einwandfrei und führt die entsprechenden Skripte aus. Wenn ich jedoch versuche, eine freigegebene Datei von meinem Host-Computer aus zu ändern, wird dieses Dateiänderungsereignis nicht weitergegeben und der Guard reagiert nicht.

So sieht mein vagabundierender freigegebener Ordner aus (ziemlich übliches Zeug)

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

Ich habe sogar versucht, NFS-Sharing ( :nfs => true) zu verwenden, aber es hat nicht geholfen.

Gibt es eine Möglichkeit, Dateiänderungsereignisse vom Host auf die virtuelle Maschine zu übertragen? Oder ist das etwas von Vagrant / VirtualBox?

AKTUALISIEREN:

Nach einigen weiteren Versuchen habe ich ZenTest gem installiert , das ein Autotest-Tool enthält, das ähnliche Funktionen in Bezug auf Dateiänderungsereignisse ermöglicht.

Beim Ausführen des Autotests auf einer virtuellen Maschine und beim Ändern von Dateien von meinem Hostcomputer werden diese Änderungen weitergegeben und der Autotest reagiert .

Auf dieser Grundlage scheint es, dass die Weitergabe von Dateiänderungsereignissen ein Problem des Schutzes ist, nicht des Vagabunden oder der virtuellen Box.

Ich habe die Implementierungsunterschiede zwischen guard und autotest nicht untersucht.

Jetzt weiß ich, dass es möglich ist, Dateiänderungsereignisse vom Host in der virtuellen Maschine abzufangen. Hat jemand eine Idee, wie dies mit guard erreicht werden kann? Ich mag Wache mehr wegen seiner DSL und generischen Benutzerfreundlichkeit.

Rdamborsky
quelle

Antworten:

10

Die Hauptursache ist, dass VirtualBox die Dateiänderungsereignisse auf dem Host nicht an die VM kaskadiert. Guard (unter Linux) erwartet Benachrichtigungen über inotify-Ereignisse. Stattdessen können Sie eine Guard-Abfrage für Ereignisse mit durchführen guard -p. Dies kann jedoch dazu führen, dass Ihre CPU maximal ausgelastet ist, sodass Sie die Abfrage mit erneut drosseln können guard -p -l 10.

Von 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
quelle
Danke Gabe, ich habe vor einiger Zeit Wache wegen watchr gelassen. Dennoch ist Ihre Antwort für das Verständnis wertvoll.
Rdamborsky
4

Ich weiß, dass dies eine ältere Frage ist, aber hier ist eine aktuellere Antwort:

-o/--listen-onDokumentation zu Guard- Optionen

Hier zum schnellen Nachschlagen eingefügt:

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

Wenn jemand auf dieses Problem stößt und der Wächter immer noch nicht funktioniert ...

Am Ende habe ich watchr benutzt . Es ist eine Alternative zur Bewachung. Die Übertragung von Ereignissen vom Host zum Gastcomputer funktioniert in watchr einwandfrei. Es ist auch flexibler als Autotest.

Rdamborsky
quelle
Events propagation from host to guest machine works ok in watchr.Wie? Verwendet es Polling? Wenn VirtualBox die Ereignisse nicht weitergibt, wie kann es wissen, wann sich eine Datei geändert hat?
Nateowami