【问题标题】:gulp.watch running only once on Windowsgulp.watch 在 Windows 上只运行一次
【发布时间】:2014-01-27 18:55:23
【问题描述】:

我刚刚开始使用 Gulp 来改进我的工作流程。我目前有一个名为styles 的任务,它编译.less 文件,还有一个名为watch 的任务,用于监视任何.less 文件中的变化,然后运行styles 任务。我的gulpfile.js 包含此代码:

var gulp = require( 'gulp' ),
        less = require( 'gulp-less' ),
        autoprefixer = require( 'gulp-autoprefixer' ),
        minifycss = require( 'gulp-minify-css' ),
        jshint = require( 'gulp-jshint' ),
        uglify = require( 'gulp-uglify' ),
        imagemin = require( 'gulp-imagemin' ),
        rename = require( 'gulp-rename' ),
        clean = require( 'gulp-clean' ),
        concat = require( 'gulp-concat' ),
        notify = require( 'gulp-notify' ),
        cache = require( 'gulp-cache' ),
        header = require( 'gulp-header' ),
        footer = require( 'gulp-footer' );

// styles task
gulp.task( 'styles', function() {
    return gulp.src( 'src/styles/main.less' )
        .pipe( less({ paths: ['src/styles/'] }) )
        .pipe( autoprefixer( 'last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4' ) )
        .pipe( gulp.dest( 'dist/assets/css' ) )
        .pipe( rename( 'main.min.css' ) )
        .pipe( minifycss() )
        .pipe( gulp.dest( 'dist/assets/css' ) )
        .pipe( notify({ message: 'Styles task complete' }) );
} )

(...)

// watch task
gulp.task('watch', function() {

    // Watch .less files
    gulp.watch('src/styles/**/*.less', function(event) {
        console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
        gulp.run('styles');
    });
});

问题是,当我运行gulp watch 时,它会启动任务并在我第一次更改.less 文件时运行styles 任务。第一次之后,我只记录了消息(File X was changed, running tasks...)。我做错了吗?

感谢任何提示或帮助!

编辑

根据要求提供一些信息:我正在运行 Node.js 0.10.24Gulp 3.4.0。下面是提示输出的截图:

【问题讨论】:

  • 请添加您的 gulp 版本以及终端输出的副本。
  • 嗨,@SteveLacy!我刚刚用您提出的信息更新了问题!
  • 感谢您添加它们。似乎您的“样式”在记录时可能存在问题,但没有调用 gulp.run 。它应该调用[gulp] Finished 'styles' in 347 μs。示例:i.imgur.com/yyOCpss.png 我会向 gulp 的创建者(我和他一起工作)询问更多信息。
  • 这是我不知道的信息,@SteveLacy!当我手动运行任务时,它只记录[gulp] running 'task'...,并且确实运行了任务,因为文件已编译、连接等。但我从未收到显示[gulp] Finished 'styles' in X μs 的消息。我期待着 gulp 创建者的反馈。谢谢!
  • 我刚和他谈过,gulp.watch 是由凝视构建的:github.com/shama/gazegulp.watch 的任何问题通常与凝视有关。建议:拆开所有零件,直到您拥有可以工作的手表。然后添加其他任务,直到您拥有完整的文件。它可能只是一个没有被样式调用的函数

标签: javascript node.js gulp


【解决方案1】:

在@SteveLacy 建议拆分我的任务部分并检查是否有任何问题导致问题后,我得到了导致错误的非常愚蠢错误:gulp-notify 仅适用于 Mac 和Linux,我的操作系统是 Windows。来自插件描述:

向 Mac 通知中心或 Linux 通知发送消息(使用 notify-send) 使用 node-notifier 模块。也可以指定自定义 通知程序(例如 Growl 通知)。

真丢脸。

我遵循了一个关于 Gulp 入门的非常好的教程,gulp-notify 是其中使用的插件之一。我的赌注是没有注意插件细节。

从我的gulpfile.js 中删除gulp-notify 后,一切正常,我得到了所有正确的日志,我的gulp watch 任务就像一个魅力!

简而言之:检查插件与您的操作系统的兼容性。

感谢所有花时间帮助我的人!

【讨论】:

  • 仅供参考:您仍然可以使用gulp-notify。有一个自定义报告器添加了 Growl 支持。见gulp-notify-growl
  • 嗨,@mikaelb!谢谢你的提示!我马上去看看!
  • gulp-notify 现在支持 Windows(通过 Growl),无需自定义报告器。见github.com/mikaelbr/gulp-notify
  • 嘿,@mikaelb!感谢您的提示,我已经在我的项目设置中使用它!工作得很好!
【解决方案2】:

我遇到了同样的问题,而我的问题完全是新手问题。如果有人像我一样不熟悉 gulp,请确保您的触发手表功能以 done() 结尾:

gulp.task("watch", function() {
  gulp.watch("lib/*.js, "foobar");
});

gulp.task("foobar", function(done) {
  // This task completion was omitted.
  done();
});

【讨论】:

  • 谢谢,这可能对我有帮助吗?为什么需要为 gulp.watch 任务触发回调?我的假设是回调需要被触发,否则它不会“继续关注”......?我的监视回调只被触发一次,然后对文件系统的任何后续更改都不会再次触发它。
【解决方案3】:

如果我没记错的话,gulp.run 在 Gulp 3.5 版中已被弃用。尝试用gulp.start(); 替换gulp.run();,看看是否可行。

【讨论】:

  • 是的,它确实存在,例如查看这个链接,甚至 Gulp 也在使用它github.com/gulpjs/gulp/blob/… 文档中可能没有提到它。但是感谢您对@SteveLacy 投反对票。
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2011-12-13
  • 2017-10-17
  • 2013-11-13
相关资源
最近更新 更多