Подтвердить что ты не робот

Node.js script работает в VM, не видит изменений папки, сделанных из основной ОС

У меня есть следующая настройка:

  • Ubuntu Lucid 32 VM создан Vagrant.
  • Папка, из которой начинается Vagrant с некоторыми CSS и JS файлами. Папка монтируется внутри виртуальной машины по адресу /vagrant/.
  • grunt.js с задачей просмотра, запущенной с VM, наблюдая за изменениями в css и js файлах. После того, как файлы были изменены, он должен объединить эти файлы в один css и один файл js.

Проблема: задача Watch в файле grunt.js не видела изменений в установленной папке.

Если я изменяю файлы внутри VM, наблюдайте, как задача работает нормально. Если я запускаю grunt.js не из виртуальной коробки, но и из main os, он также работает. Пробовал в Mac OS и Windows 7.

Проблема возникает только тогда, когда задача запускается с VM, а файлы меняются из основной ОС. Есть ли способ обхода проблемы?

Обновить. Некоторые сведения о наших сценариях использования, чтобы лучше понять контекст:

  • Мы создаем студию, в которой 10+ работают с кодом.
  • Различные люди, использующие разные ОС. У нас есть: Win 7, Mc OS X и Ubuntu Linux.
  • Мы работаем над 100 другими проектами и поддерживаем их.
  • Prjects используют разные языки и настройки: у нас есть проекты PHP на наших собственных CMS, проектах PHP на проектах Yii, Python на Django и некоторых проектах node.js.
  • Различные разработчики могут в какой-то момент работать над любым из этих проектов.
  • Прямо сейчас мы проводим много времени каждый раз, когда нам нужно сделать работу над проектом на компьютере разработчика, который раньше не работал с ним. И, как правило, нам нужна помощь разработчика, который уже работал над этим, чтобы заставить его работать.

Мы хотим сделать его более прямым. Для этого мы пытаемся использовать Vagrant и ряд предварительно сконфигурированных образов ОС.

Теперь настройка проекта выглядит следующим образом:

  • Проект проверки разработчиков от git.
  • Разработчик открывает папку проекта в терминале.
  • Разработчик входит в "бродягу".
  • Через 5 минут он полностью сконфигурировал и выполнил рабочую копию проекта.

Нам нравится эта настройка, и большую часть времени у нас не было никаких проблем с ней. Но в наших проектах node.js мы используем некоторые препроцессоры css и js и хотели бы обновлять их файлы в реальном времени. И есть проблема на начальном посту.

Решения с доступом к файлам с ssh VM и файлами проектов внутри VM, вероятно, будут работать, но они не решили базовую проблему (быстрая и простая настройка большого количества проектов в группе разработчиков, работающих под управлением разных ОС)

4b9b3361

Ответ 1

Наблюдатели за файлами/дорожками зависят от установок нижнего уровня ОС, таких как inotify на Linux или kqueue на BSD-системах. Эти механизмы напрямую работают с драйверами файловой системы, и они не будут видеть изменения в сетевых установках. Если ваш script будет работать на виртуальной ОС, вы можете изменить направление совместного использования. Вместо того, чтобы выходить в общую папку на хост-системе из гостевой ОС, используйте настоящую папку на гостевой ОС (где происходит реальное действие) и достаньте ее из главной операционной системы, чтобы редактировать ваши файлы. Таким образом, ваша гостевая ОС будет работать так же, как и в ее производственной среде, что и есть Vagrant promises; но, по-видимому, не доставляет.

Я лично использую редактор Sublime Text 2 с плагином SFTP. В этой настройке я сохраняю две копии файлов и работаю над ними на ОС хоста. Всякий раз, когда я редактирую/добавляю файл, мой редактор быстро загружает его на сервер, то есть гостевую ОС. Когда я перехожу на серверы производства, я все же могу использовать тот же подход, который лучше, чем использование общих папок.

Прежде чем переключиться на Sublime в качестве основного редактора, я использовал Vim уже более десяти лет. В то время вместо использования средств Vim sftp/ssh, которые всегда были ошибочными, я использовал WinSCP как SFTP-клиент. После того, как вы настроите его правильно, всякий раз, когда вы дважды щелкаете файл на сервере, он открывает его по вашему выбору редактора, и всякий раз, когда вы сохраняете файл, WinSCP автоматически загружает его на сервер. Это было очень близко к тому, что у меня есть с Sublime SFTP-плагином; однако локальные (хост-системы) версии файлов были созданы во временных папках, которые WinSCP создает на лету.

Подход Sublime SFTP-плагина имеет, который имеет дубликаты папок на обеих системах, лучше всего подходит мне, потому что у меня также есть SpiderOak, работающий как мое решение для резервного копирования на ОС хоста. Мне нравится, так как он хранит историю версий файлов. Я настраивал его, чтобы проверять изменения один раз в час, вместо того, чтобы постоянно следить за тем, чтобы сделать его более плавным, рискуя потерять работу в час в случае сбоя системы. Все работает отлично в этой настройке, и я действительно использовал ее функцию старых версий более чем несколько раз, что избавило меня от многих трудностей и потери работы.

Итак, в общем, если вы хотите продолжить работу с общими папками, то вы должны установить и настроить Samba/NFS/FTP-сервер на гостевой ОС (ваш Ubuntu) и обмениваться папками. Затем вы получите доступ к сетевому ресурсу из ОС хоста (Mac/Win7) так же, как и к другим общим удаленным папкам. Если ваше использование и потребности похожи на мои, то я настоятельно рекомендую вам использовать Sublime + SFTP или YourEditor и WinSCP или аналогичный SFTP-клиент.

ОБНОВЛЕНИЕ: Основываясь на особенно симптоме, суммированном как "Если я меняю файлы внутри виртуальной машины, наблюдайте, как задача работает нормально. Если я запускаю grunt.js не из виртуальной коробки, а из main os, она также работает". в вопросе я сделал неправильное предположение о том, как grunt.js наблюдает за файлами и папками. Я думал, что он использует функции часов node fs. *; но, как показал pyfunc с хорошо проведенными исследованиями, мое предположение было неправильным. Хотя это не влияет на результат какого-либо предложения, которое я сделал, это была неправильная техническая информация, которую я должен извиниться. Таким образом, похоже, что проблема вызвана временами модификации файлов, которые не заданы правильно, когда модификация выполняется на удаленном компьютере, что может сделать vboxfs бесполезным для такого использования, которое зависит от времени модификации файлов.

Ответ 2

Примечание: Я не представляю никакого полного решения, и я не программист JavaScript

Раздел о проблеме grunt.js при просмотре файла

Источник: https://github.com/cowboy/grunt/blob/master/tasks/watch.js

Раздел, где он выполняет просмотр файла. Он использует fs.statSync(синхронный stat):

// Get last modified time of file.
            mtime = +fs.statSync(filepath).mtime;
            // If same as stored mtime, the file hasn't changed.
            if (mtime === mtimes[filepath]) { return; }
            // Otherwise it has, store mtime for later use.
            mtimes[filepath] = mtime;
          }

Он использует функциональность "fs" из node.js: http://nodejs.org/api/fs.html#fs_class_fs_stats

Среди различных данных в файле он возвращает следующие атрибуты времени:

atime: Mon, 10 Oct 2011 23:24:11 GMT,
mtime: Mon, 10 Oct 2011 23:24:11 GMT,
ctime: Mon, 10 Oct 2011 23:24:11 GMT 

Итак, вывод заключается в том, что он использует stat. Вы можете написать простой файл js с использованием fs из node.js, чтобы проверить результат fs.statSync до и после изменения файла в общей папке.

Это установит, если вы должны смотреть файл с помощью утилиты watcher из файла grunt.js.

Небольшая заметка об общих папках в VirtualBox

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

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

Ответ 3

У меня была та же проблема, что и виртуальная машина CentOS 7 с VirtualBox на хосте Windows 10: браузеру не удалось обнаружить изменения в общей папке VBox. Что помогло мне немного настроить процесс просмотра. Browsersync использует chokidar для контроля файлов. Настройка usePolling: true решила проблему для меня. Как сделать это полезным для вашего случая?

  • попробуйте найти плагин, который использует chokidar. Получить опрос используйте опрос.
  • настроить настройки вашего наблюдателя.