Watchify 更新事件永远不会在 Virtualbox 中触发
Watchify update event never fires in Virtualbox
我正在尝试让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']);
});
我已经尝试了许多示例,但是通过watchify捆绑包永远不会更新。
我在Vagrant VM中运行Gulp,主机是OSX Yosemite,来宾是Ubuntu 14.04。
任何帮助将不胜感激!
轮询是在 3.0.0 中添加的。
您可以使用poll
选项激活它。
var w = watchify(b, {
poll: true
});
从文档:opts.poll
启用轮询以监视更改。如果设置为 true,则使用 100ms 的轮询间隔。如果设置为数字,则该毫秒数将是轮询间隔。有关更多信息,请参阅 Chokidar 关于"usePolling"和"interval"的文档。如果您正在监视 NFS 卷,则此选项很有用。
这是因为watchify
依赖于inotify来检测文件更改,只要它们从虚拟机内部启动(例如,在这些文件上使用touch
(,就可以很好地工作。但是,由于 VirtualBox 的限制,它不会拾取在外部执行的更改,当主机系统中的文件发生更改时,它不会触发来宾系统中的相应事件。显然,VMware也遇到了同样的问题。
目前有一些讨论可以回退到轮询 watchify
和 chokidar
中的网络挂载(watchify
实际上用于监视文件(以缓解此特定问题:
- https://github.com/substack/watchify/issues/120
- https://github.com/paulmillr/chokidar/issues/242
我遇到了同样的问题,我发现并不是 watchify 更新事件永远不会触发,而是默认情况下它不输出任何日志记录信息。
如果您将更新绑定更改为此绑定,我想您会发现它实际上正在触发:
// this is never fired!
bundler.on('update', function () {
console.log('update event');
bundle();
});
这就是为什么在gulp启动器中,他们构建了一个用于捆绑的自定义记录器。
更新:Danny Moerkeke(OP(写道:"我已经尝试过这个来验证处理程序是否被触发,但事实并非如此。 但是您的答案将我送向了正确的方向,因为当我直接在VM中使用vi编辑文件时,它可以工作!工作区被挂载到流浪者内部的共享文件夹中,我也在这个 VM 中运行 gulp。当我在主机上的编辑器中编辑文件时,更新事件不会触发,因此显然这里的某些内容不适用于流浪共享文件夹。当我在主机上运行gulp时,一切正常。我们的想法是将所有内容都保留在 VM 中,但实际上这很好(而且更快!
在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
- Javascript循环不会自我更新
- 添加文字和评论功能更新Div
- AngularJS:ng之后,重复$scope值未按预期更新
- 如何通过数组更新角度子范围
- Ajax聊天消息重复而不仅仅是更新
- 通过CSV文件上载更新数据库表
- 平均值:无法将数据更新到数据库
- $rootScope未使用forEach进行更新
- d3基于用户选择动态更新节点
- 有条件更新d3.js力图中节点的最佳方法
- Angular:更新一次性绑定的数据
- Javascript更新孙窗口中的表单元素
- 使用AngularJS中的筛选器更新给定的表
- 从选项页面更新chrome扩展清单权限
- 如何在不刷新页面的情况下更新显示框
- 延期承诺值未更新/解析/延期
- 标记的实时更新,无需加载页面谷歌地图API V3
- 使用mongodb更新中的一个变量
- 访问jsrender模板中的全局javascript变量并更新它
- Watchify 更新事件永远不会在 Virtualbox 中触发