【问题标题】:Gulp Watch only run onceGulp Watch 只运行一次
【发布时间】:2015-05-28 18:58:09
【问题描述】:

我正在使用这个 Gulp Watch 示例:https://github.com/floatdrop/gulp-watch/blob/master/docs/readme.md#starting-tasks-on-events

var gulp = require('gulp');
var watch = require('gulp-watch');
var batch = require('gulp-batch');

gulp.task('build', function () { console.log('Working!'); });

gulp.task('watch', function () {
    watch('**/*.js', batch(function () {
        gulp.start('build');
    }));
});

当我在我的 Windows 8 机器上运行它时,它只在我第一次更改文件时运行:

C:\test>gulp watch
[08:40:21] Using gulpfile C:\test\gulpfile.js
[08:40:21] Starting 'watch'...
[08:40:21] Finished 'watch' after 2.69 ms
[08:40:31] Starting 'build'...
Working!
[08:40:31] Finished 'build' after 261 µs

下次什么都没有发生。为什么?

【问题讨论】:

  • 您是否更改了任何文件?因为当你执行 gulp watch 时,它正在监视文件。然后,当您更改文件时,会触发 watch 中的函数。
  • 是的,也许我不够清楚。我正在更改文件,但 watch 仅在我第一次更改文件时执行。例如。如果我启动gulp watch,更改我的 *.js 文件中的某些内容并保存它,手表正在运行。如果我随后更改同一文件中的其他内容并再次保存,则手表未运行。 gulp watch 进程仍在运行,但没有任何反应。
  • 如果您仍然想使用gulp-batch,正确的用法是在那里有一个done 回调:done - 是您的函数信号批处理的回调,您已经完成了。所以:gulp.task('watch', function () { watch('**/*.js', batch(function (events, done) { gulp.start('build'); done(); })); });

标签: gulp gulp-watch


【解决方案1】:

如果您仔细阅读文档,您会看到以下短语:

您可以传递普通回调,它将在每个事件上调用或将其包装在 gulp-batch 中以运行它一次

所以,这基本上就是与gulp-batch 的交易。要持续观看,只需删除批处理调用:

gulp.task('build', function (done) { 
    console.log('Working!'); 
    done();
});

gulp.task('watch', function () {
    watch('app/*.js', function () {
        gulp.start('build');
    });
});

(并将“完成”回调添加到 build 以让 Gulp 知道您何时完成)。

顺便说一句...我不确定,但我认为gulp-watch 不仅用于观看文件,还用于直接返回乙烯基对象。所以实际使用内置的gulp.watch应该是一样的效果:

gulp.task('watch', function () {
    gulp.watch('app/**/*.js', ['build']);
});

【讨论】:

  • 旧帖子,但我再次引用@ddprrt 所说的话,"(and add the 'done' callback to build to let Gulp know when you're finished)." 这几乎让我在墙上撞了几个小时。谢谢大佬
  • 从 gulp 4 开始,done 回调是必须的,看来....thx!
  • 嗨@ddprrt 似乎当两个开发人员在同一个系统上工作时,其他开发人员随后(第一个工作)cntrl + s 没有通过 gulp 检测到。即使它适用于同一系统。有什么想法吗?
【解决方案2】:

我遇到了同样的问题,使用的和ddprrt一样。不同之处在于使用目录通配符与绝对路径相对。

我改变了这个:

 gulp.task('watch', function() {
   gulp.watch('sass/shortcutcss/*.scss', ['sass'])
 });

到这里:

 gulp.task('watch', function() {
   gulp.watch('sass/**/*.scss', ['sass'])
 });

【讨论】:

  • 这里有同样的问题和同样的解决方案。也许在 github 上打开一个关于这个的问题会是一个好主意。
  • 我遇到了同样的问题,添加通配符目录 /**/*.scss 解决了,现在可以了
  • 看起来问题仍然相关。 /**/ 通配符目录解决了我的问题。
  • 我必须对目录使用** 通配符,对文件名使用* 通配符。我不能使用确切的目录和文件名,奇怪!
【解决方案3】:

这个问题让我疯狂了一个周末。我都试过了:

  • 添加 done()-事件
  • 重命名/触摸/清除目标 CSS
  • 文件路径更具体

但是(这个问题的原因和)解决方案是如此简单,以至于我在那之后感到很可悲:

只是update your nodejs installation,我的是0.12.x!难怪这不起作用。

之后,监视事件再次起作用。有时它也会再次出错。但在这种情况下,只需再次保存您的文件,它就会被识别。 (我认为foundation/gulp watch 会快速检查更改,同时您的文件会被新上传的文件替换)

【讨论】:

    【解决方案4】:

    对我来说,这是在任务中添加“返回”:

    gulp.task('styles', function(){
     return gulp.src('css/styles.css')
        .pipe(autoprefixer())
        .pipe(gulp.dest('build'));
    });
    

    【讨论】:

    • ...或传递和调用回调:(cb) => { something(); cb(); }
    【解决方案5】:

    长篇大论:
    对我来说,它没有工作很长时间。一切似乎都设置正确,但只运行一次。

    但突然间,我开始在另一个项目中使用 parcel js,而他们的内置手表也发生了同样的事情。于是我寻找答案,发现问题出在我的 Vim 设置上。

    回答对我有帮助的是来自@acobster https://stackoverflow.com/a/55435197/2686510的这个

    简而言之:
    通过添加 set backupcopy=yes 来更新 .vimrc

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      相关资源
      最近更新 更多