Vagrant общая папка и события изменения файла

14

У меня есть виртуальная машина Ubuntu, к которой я получаю доступ через Vagrant. На моем хосте (Mac OSX) есть папка с несколькими файлами, которые я разделяю на виртуальной машине. В этой виртуальной машине я хочу использовать guard, чтобы отслеживать изменения файлов и выполнять некоторые действия, если какой-либо из этих файлов изменяется.

Я правильно настроил охрану, и при смене общего файла из виртуальной машины он работает нормально и запускает соответствующие сценарии. Но, если я пытаюсь изменить общий файл с моего хоста, это событие изменения файла не распространяется и защита не реагирует.

Вот так выглядит моя бродячая общая папка (довольно обычные вещи)

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

Я даже пытался использовать NFS shared ( :nfs => true), но это не помогло.

Есть ли способ заставить события изменения файла распространяться с хоста на виртуальную машину? Или это что-то вроде Vagrant / VirtualBox?

ОБНОВИТЬ:

После еще нескольких испытаний я установил ZenTest gem, который содержит инструмент для автоматического тестирования , позволяющий выполнять аналогичные функции в отношении событий изменения файла.

При запуске автотеста на виртуальной машине и изменении файлов с моего хоста эти изменения распространяются и автотест реагирует .

Исходя из этого, кажется, что распространение события изменения файла является вопросом защиты, а не бродяги или виртуальной коробки.

Я не смотрел на различия в реализации между защитой и автотестом, хотя.

Теперь я знаю, что можно отслеживать события изменения файлов с хоста на виртуальной машине. У кого-нибудь есть идеи о том, как этого добиться с помощью охраны? Мне больше нравится охрана из-за его DSL и общего удобства использования.

rdamborsky
источник

Ответы:

10

Основная причина заключается в том, что VirtualBox не связывает события изменения файлов на хосте с виртуальной машиной. Guard (в Linux) ожидает получения уведомлений через события inotify. Вместо этого вы можете провести охранный опрос для событий с guard -p, но это может привести к максимальной загрузке вашего процессора, так что вы можете уменьшить опрос с помощью guard -p -l 10.

От 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

Гейб Мартин-Демпси
источник
Спасибо Гейб, я оставил стражу для наблюдателя некоторое время назад. Тем не менее, ваш ответ ценен для понимания.
рдамборский
4

Я знаю, что это более старый вопрос, но вот более актуальный ответ:

Охранная -o/--listen-onдокументация

Вставлено здесь для быстрого ознакомления:

-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

Если кто-то сталкивается с этой проблемой, и охрана все еще не работает ...

Я в конечном итоге с помощью сторожа . Это альтернатива для охраны. Распространение событий от хоста к гостевой машине работает нормально в watchr. Это также более гибкий, чем автотест.

rdamborsky
источник
Events propagation from host to guest machine works ok in watchr.Как? Использует ли он опрос? Если VirtualBox не распространяет события, как он может узнать, когда файл изменился?
Nateowami