Eventos de alteração de arquivo e pasta compartilhada do Vagrant

14

Eu tenho uma máquina virtual ubuntu que estou acessando através do Vagrant. No meu host (Mac OSX), há uma pasta com alguns arquivos que eu compartilho na máquina virtual. Nessa máquina virtual, quero usar o guarda para observar as alterações nos arquivos e executar alguma ação se algum desses arquivos for alterado.

Configurei a proteção corretamente e, ao alterar o arquivo compartilhado de dentro da máquina virtual, ele funciona bem e executa os scripts apropriados. Mas, se eu tentar alterar o arquivo compartilhado da minha máquina host, esse evento de alteração de arquivo não se propaga e o protetor não reage.

É assim que minha pasta compartilhada é vagabunda (coisas bastante comuns)

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

Eu até tentei usar o compartilhamento NFS ( :nfs => true), mas não ajudou.

Existe alguma maneira de fazer com que os eventos de alteração de arquivo sejam propagados do host para a máquina virtual? Ou isso é algo da natureza do Vagrant / VirtualBox?

ATUALIZAR:

Após mais algumas tentativas, instalei o ZenTest gem, que contém a ferramenta de autoteste, que permite funcionalidade semelhante em relação a eventos de alteração de arquivo.

Ao executar o autoteste na máquina virtual e alterar os arquivos da minha máquina host, essas alterações são propagadas e o autoteste reage .

Com base nisso, parece que a propagação de eventos de alteração de arquivo é um problema de guarda, não de caixa virtual ou vagabunda.

Não analisei as diferenças de implementação entre guarda e autoteste.

Agora eu sei que é possível capturar eventos de alteração de arquivo do host na máquina virtual. Alguém tem alguma idéia de como conseguir isso usando guarda? Eu gosto de guardar mais por causa de sua DSL e usabilidade genérica.

rdamborsky
fonte

Respostas:

10

A causa principal é que o VirtualBox não envia em cascata os eventos de alteração de arquivo no host para a VM. O Guard (no Linux) espera receber notificações por meio de eventos inotify. Em vez disso, você pode ter uma pesquisa de guarda para eventos com guard -p, mas isso pode levar ao máximo da CPU, para que você possa acelerar a pesquisa novamente 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
fonte
Obrigado Gabe, deixei a guarda para vigiar há algum tempo. Ainda assim, sua resposta é valiosa para a compreensão.
Rdamborsky
4

Sei que essa é uma pergunta mais antiga, mas aqui está uma resposta mais atualizada:

-o/--listen-onDocumentação das opções de guarda

Colado aqui para referência 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
fonte
1

Se alguém encontrar esse problema e o guarda ainda não estiver funcionando ...

Acabei usando watchr . É uma alternativa para guardar. A propagação de eventos do host para a máquina convidada funciona bem no watchr. Também é mais flexível que o autoteste.

rdamborsky
fonte
Events propagation from host to guest machine works ok in watchr.Quão? Ele usa pesquisa? Se o VirtualBox não estiver propagando os eventos, como saber quando um arquivo foi alterado?
Nateowami