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

 mobiledu2502876223 发布于 2022-12-04 02:17

我试图让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 个回答
  • 这是因为watchify依赖于inotify来检测文件更改,只要它们是从虚拟机内部启动的(例如,使用touch这些文件),这些更改就会很好.但是,由于VirtualBox的限制在主机系统中更改文件时不会触发guest 虚拟机系统中的相应事件,因此它不会获取外部执行的更改.显然VMware遇到了同样的问题.

    目前有一些讨论可以回溯到网络挂载watchifychokidar(watchify实际上用于监视文件)的轮询,以缓解这个特殊问题:

    https://github.com/substack/watchify/issues/120

    https://github.com/paulmillr/chokidar/issues/242

    2022-12-11 02:06 回答
  • 轮询在3.0.0中添加.

    您可以使用该poll选项激活它.

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

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

    2022-12-11 02:08 回答
  • 在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

    2022-12-11 02:13 回答
  • 我遇到了同样的问题,我发现并不是说watchify更新事件永远不会触发,而是默认情况下它不会输出任何日志记录信息.

    如果你更新你的更新绑定,我想你会发现它实际上是在解雇:

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

    这就是为什么在gulp starter中他们为捆绑构建了一个自定义记录器.


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

    2022-12-11 02:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有