Watchify更新事件永远不会在Virtualbox中触发

时间:2014-12-23 11:15:30

标签: javascript gulp

我正在努力让Watchify与Gulp合作,但似乎更新了'事件永远不会被解雇。

这是我的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']);
});

我尝试了很多例子,但是看看捆绑从不更新。

我在Vagrant VM中运行Gulp,主机是OSX Yosemite,客户是Ubuntu 14.04。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:23)

Polling was added in 3.0.0.

您可以使用var a1 = new A { ID = "One" }; session.Save(a1); var a2 = new A { ID = "Two" }; session.Save(a2); session.Flush(); var b1 = new B { ID = a1.ID }; session.Save(b1); var b2 = new B { ID = a2.ID }; session.Save(b2); session.Flush(); A a = null; B b = null; var result = _session.QueryOver(() => a) .JoinQueryOver(() => a.Bs, () => b,JoinType.LeftOuterJoin) .List(); 选项激活它。

poll

来自文档: var w = watchify(b, { poll: true }); 启用轮询以监控更改。如果设置为true,则使用100ms的轮询间隔。如果设置为数字,那么该毫秒数将是轮询间隔。有关详细信息,请参阅Chokidar的documentation“usePolling”和“interval”。如果您正在观看NFS卷,此选项很有用。

答案 1 :(得分:17)

这是因为watchify依赖于inotify来检测文件更改,只要它们是从虚拟机内部启动的(例如,在这些文件上使用touch)就可以正常工作。但是,由于limitation with VirtualBox在主机系统中更改文件时未在guest虚拟机系统中触发相应事件,因此它不会接收在外部执行的更改。显然VMware会受到same problem的影响。

目前有一些讨论可以追溯到watchifychokidarwatchify实际用来观看文件)的网络登录轮询,以缓解此特定问题:

答案 2 :(得分:10)

我遇到了同样的问题,我发现并不是看起来更新事件永远不会触发,默认情况下它不会输出任何记录信息。

如果您将更新绑定更改为此,我认为您会发现它实际上正在解雇:

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

这就是gulp starter他们为捆绑制作custom logger的原因。


更新:Danny Moerkeke(OP)写道:"我已经尝试过这个来验证处理程序是否被触发而且它没有被解雇。但是,当我使用vi直接在VM中编辑文件时,你的回答是朝着正确的方向发送的!工作区安装在vagrant内的共享文件夹中,我也在这个VM中运行gulp。当我在主机上的编辑器中编辑文件时,不会触发更新事件,因此显然这里的某些内容与vagrant共享文件夹不兼容。当我在主机上运行gulp一切正常。我的想法是将所有内容保留在VM中,但实际上这很好(而且更快!)"

答案 3 :(得分:5)

在Vagrantfile中将同步文件夹系统设置为RSync 解决了我的问题。

启用此功能后,当您在主机上更改编辑器中的文件时,它将通过客户端上的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