【问题标题】:Watchify update event never fires in VirtualboxWatchify 更新事件永远不会在 Virtualbox 中触发
【发布时间】:2014-12-23 11:15:29
【问题描述】:

我正在尝试让 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);

但是,当我在没有 watchify 的情况下明确查看文件时:

"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']);
});

我已经尝试了很多示例,但使用 watchify 包永远不会更新。

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

非常感谢任何帮助!

【问题讨论】:

标签: javascript gulp


【解决方案1】:

Polling was added in 3.0.0.

您可以使用poll 选项激活它。

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

来自文档: opts.poll 启用轮询以监控更改。如果设置为 true,则使用 100 毫秒的轮询间隔。如果设置为数字,则该毫秒数将是轮询间隔。有关更多信息,请参阅 Chokidar 关于“usePolling”和“interval”的 documentation。如果您正在查看 NFS 卷,此选项很有用。

【讨论】:

  • 这应该被标记为有效答案。在 VM 环境中运行 gulp 时,如果没有轮询,watchify 将无法工作。
【解决方案2】:

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

目前有一些讨论可以退回到在 watchifychokidarwatchify 实际上用于监视文件)中轮询网络挂载来缓解这个特殊问题:

【讨论】:

  • 感谢您的澄清!
【解决方案3】:

我遇到了同样的问题,我发现并不是 watchify update 事件永远不会触发,而是它默认不输出任何日志信息。

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

// 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 中,但实际上这很好(而且更快!)“

【讨论】:

  • 感谢您抽出宝贵时间内特。我已经尝试过这个来验证处理程序被解雇了,但事实并非如此。但是您的回答使我朝着正确的方向前进,因为当我直接在 VM 中使用 vi 编辑文件时,它可以正常工作!工作区安装到 vagrant 内的共享文件夹,我也在这个 VM 内运行 gulp。当我在主机上的编辑器中编辑文件时,不会触发更新事件,因此显然这里的某些内容不适用于 vagrant 共享文件夹。当我在主机上运行 gulp 时,一切正常。想法是将所有内容都保留在 VM 中,但实际上这很好(而且更快!)
  • 很抱歉我的回答不正确,但我很高兴能够在推动您解决实际问题方面发挥作用。
  • 在这上面浪费了一天...同样的问题,更新从未从我的流浪机器上的主机中运行的 gulp 中触发。从我的主机上运行相同的 gulp 并且它有效!谢谢...
【解决方案4】:

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

启用此功能后,当您在主机上的编辑器中更改文件时,它将通过客户机上的 RSync 即时复制并相应地触发观察者事件。

为此,只需将以下配置添加到您的文件中:

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

在您的终端中,使用以下命令启动 vagrant 会话:

vagrant up && vagrant rsync-auto

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 2011-11-19
    • 2015-05-27
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多