Événements de changement de dossier partagé et de fichier Vagrant

14

J'ai une machine virtuelle ubuntu à laquelle j'accède via Vagrant. Sur mon hôte (Mac OSX), il y a un dossier avec quelques fichiers, que je partage sur une machine virtuelle. Dans cette machine virtuelle, je veux utiliser Guard pour surveiller les modifications de fichiers et effectuer une action si l'un de ces fichiers change.

J'ai installé la garde correctement et lors du changement de fichier partagé à partir de la machine virtuelle, cela fonctionne bien et exécute les scripts appropriés. Mais, si j'essaye de changer le fichier partagé de ma machine hôte, cet événement de changement de fichier ne se propage pas et guard ne réagit pas.

Voici à quoi ressemble mon dossier partagé vagabond (trucs assez habituels)

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

J'ai même essayé d'utiliser le partage NFS ( :nfs => true) mais cela n'a pas aidé.

Existe-t-il un moyen de faire en sorte que les événements de modification de fichier se propagent de l'hôte à la machine virtuelle? Ou est-ce quelque chose de la nature de Vagrant / VirtualBox?

MISE À JOUR:

Après quelques essais supplémentaires, j'ai installé ZenTest gem, qui contient un outil d'autotest permettant des fonctionnalités similaires concernant les événements de changement de fichier.

Lors de l'exécution de l'autotest sur une machine virtuelle et de la modification de fichiers depuis ma machine hôte, ces modifications sont propagées et l' autotest réagit .

Sur cette base, il semble que la propagation des événements de changement de fichier soit un problème de garde, pas de boîte vagabonde ou virtuelle.

Je n'ai cependant pas examiné les différences d'implémentation entre guard et autotest.

Maintenant, je sais qu'il est possible d'attraper les événements de changement de fichier depuis l'hôte dans la machine virtuelle. Quelqu'un a-t-il une idée sur la façon d'y parvenir en utilisant la garde? J'aime plus la garde en raison de son utilisation DSL et générique.

rdamborsky
la source

Réponses:

10

La cause principale est que VirtualBox ne met pas en cascade les événements de changement de fichier sur l'hôte vers la machine virtuelle. Guard (sous Linux) s'attend à recevoir des notifications via des événements inotify. Au lieu de cela, vous pouvez avoir un sondage de garde pour les événements avec guard -p, mais cela peut conduire à un maximum de votre processeur, vous pouvez donc limiter le sondage avec 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
la source
Merci Gabe, j'ai quitté la garde pour watchr il y a quelque temps. Pourtant, votre réponse est précieuse pour la compréhension.
rdamborsky
4

Je sais que c'est une question plus ancienne, mais voici une réponse plus à jour:

-o/--listen-onDocumentation des options de garde

Collé ici pour référence rapide:

-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
la source
1

Si quelqu'un rencontre ce problème et que la garde ne fonctionne toujours pas ...

J'ai fini par utiliser watchr . C'est une alternative à garder. La propagation des événements de l'hôte à la machine invitée fonctionne correctement dans watchr. Il est également plus flexible que l'autotest.

rdamborsky
la source
Events propagation from host to guest machine works ok in watchr.Comment? Utilise-t-il le sondage? Si VirtualBox ne propage pas les événements, comment peut-il savoir quand un fichier a changé?
Nateowami