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

Просмотр события обновления никогда не срабатывает в Virtualbox

Я пытаюсь работать с Gulp, но кажется, что событие "update" никогда не запускается.

Здесь мой gulpfile.js:

"use strict";

var gulp = require('gulp');
var browserify = require('browserify');
var source = require("vinyl-source-stream");
var watchify = require('watchify');

var bundler = watchify(browserify({entries: ['./client/app/app.js'], cache: {}, packageCache: {}, fullPaths: true}));

gulp.task('js', bundle); 

function bundle() {
    console.log('bundle');
    return bundler.bundle()
    .pipe(source('bundle.js'))
    .pipe(gulp.dest('./dist'));
}

// this is never fired!
bundler.on('update', bundle);

Однако, когда я явно просматриваю файлы без проверки, это работает:

"use strict";

var gulp = require('gulp');
var browserify = require('browserify');
var source = require("vinyl-source-stream");
var watchify = require('watchify');

function bundle() {
    console.log('bundle');
    return browserify('./client/app/app.js')
    .bundle()
    .pipe(source('bundle.js'))
    .pipe(gulp.dest('./dist/'));
}

gulp.task('browserify', bundle);

gulp.task('js', function() {
    bundle();
    gulp.watch(['client/**/*.js'], ['browserify']);
});

Я пробовал множество примеров, но, проверяя, что пакет никогда не обновляется.

Я запускаю Gulp внутри Vagrant VM, хост OSX Yosemite, гостем Ubuntu 14.04.

Любая помощь очень ценится!

4b9b3361

Ответ 1

У меня была такая же проблема, и я обнаружил, что это не значит, что событие обновления watchify никогда не срабатывает, так как оно не выводит информацию о регистрации по умолчанию.

Если вы измените привязку обновления к этому, я думаю, вы обнаружите, что он действительно стреляет:

// this is never fired!
bundler.on('update', function () {
    console.log('update event');
    bundle();
});

Поэтому в gulp стартер они построили пользовательский журнал для связывания.


Обновление: Danny Moerkeke (OP) писал: "Я уже пробовал это, чтобы проверить, что обработчик уволен, и это не так. НО ваш ответ отправил меня в правильном направлении, когда я редактирую файл с vi непосредственно в виртуальной машине это работает! Рабочее пространство монтируется в общую папку внутри брандмауэра, и я запускаю gulp внутри этой виртуальной машины. Когда я редактирую файл в своем редакторе на хосте, событие обновления не запускается, так что, видимо, что-то здесь не работает с обходными папками с бродягой. Когда я запускаю gulp на хосте, все работает отлично. Идея заключалась в том, чтобы держать все внутри виртуальной машины, но на самом деле это нормально (и быстрее!)"

Ответ 2

Опрос добавлен в 3.0.0.

Вы можете активировать его с помощью параметра poll.

var w = watchify(b, {
  poll: true
});

Из документов: opts.poll разрешает опрос отслеживать изменения. Если установлено значение true, то используется интервал опроса 100 мс. Если задано число, то это количество миллисекунд будет интервалом опроса. Для получения дополнительной информации см. Документацию Chokidar в разделе "usePolling" и "interval" . Эта опция полезна, если вы смотрите тома NFS.

Ответ 3

Это связано с тем, что watchify полагается на inotify для обнаружения изменений файлов, которые отлично работают до тех пор, пока они инициируются внутри вашей виртуальной машины (например, используя touch в этих файлах). Тем не менее, он не будет получать изменения, выполненные за пределами, из-за ограничения с VirtualBox, которое не вызывает соответствующие события в гостевой системе, когда файл изменяется на хосте система. По-видимому VMware страдает от той же проблемы.

В настоящее время обсуждается вопрос о возврате опроса для сетевых подключений в watchify и chokidar (который watchify фактически использует для просмотра файлов) для устранить эту конкретную проблему:

Ответ 4

Установка системы синхронизированных папок в RSync в Vagrantfile решила мою проблему.

Если эта функция включена, когда вы меняете файлы в своем редакторе на хосте, она будет скопирована "на лету" через RSync на гостя и соответствующим образом инициирует события наблюдателя.

Для этого просто добавьте в файл следующую конфигурацию:

Vagrant.configure("2") do |config|
  config.vm.synced_folder ".", "/vagrant", type: "rsync",
end

В своем терминале запустите бродячий сеанс со следующей командой:

vagrant up && vagrant rsync-auto

http://docs.vagrantup.com/v2/synced-folders/rsync.html