Gulp文件运行任务并通知两次

5

我刚刚开始第一次使用gulp,导入了我想要使用的所有插件,并编写了第一个用于sass编译的任务。它似乎能够工作,但存在两个问题。首先,当我在命令行中输入gulp时,它似乎需要3到4秒才能启动,这比grunt慢(我开始使用gulp是因为我了解它更快)。这是正常的吗?

然而,主要问题是我有一个默认任务,它调用sass任务。命令行输出似乎表明两者都在运行,这意味着sass被编译了两次。它还会输出我的单个gulp-notify通知两次,这似乎不正确。

以下是命令行输出...

λ gulp default
[00:53:40] Using gulpfile ~\Desktop\jon\gulpfile.js
[00:53:40] Starting 'sass'...
[00:53:40] Finished 'sass' after 10 ms
[00:53:40] Starting 'default'...
[00:53:40] Finished 'default' after 7.93 μs
[00:53:41] gulp-notify: [Gulp notification] Css created
[00:53:41] gulp-notify: [Gulp notification] Css created

以下是完整的gulp文件...

var gulp = require('gulp'),
    gutil = require('gulp-util'),
    compass = require('gulp-compass'),
    rename = require('gulp-rename'),
    uglify = require('gulp-uglify'),
    watch = require('gulp-watch'),
    concat = require('gulp-concat'),
    notify = require('gulp-notify'),
    jshint = require('gulp-jshint'),
    autoprefixer = require('gulp-autoprefixer'),
    minifyCSS = require('gulp-minify-css'),
    traceur = require('gulp-traceur'),
    svgmin = require('gulp-svgmin'),
    imagemin = require('gulp-imagemin'),
    ngAnnotate = require('gulp-ng-annotate'),
    expect = require('gulp-expect-file'),
    sourcemaps = require('gulp-sourcemaps');

var paths = {
    src: "src",
    css: "stylesheets",
    img: "images",
    js:  "js"
}


// Compile Our Sass
gulp.task('sass', function() {

    gulp.src(paths.src + '/sass/*.scss')
        .pipe(sourcemaps.init())
        .pipe(compass({
            sass: 'src/sass',
            environment: 'development',
            outputStyle: 'expanded',
            debugInfo: false,
            noLineComments: true
        }))
        .pipe(autoprefixer('> 5%', 'last 2 version', 'ie 9'))
        .pipe(sourcemaps.write('./'))
        .pipe(gulp.dest(paths.css))
        .pipe(notify({ message: 'Css created' }));

});


// Dev Task
gulp.task('default', ['sass']);

有人知道这里发生了什么吗?我是否误解了Gulp任务的工作方式?


半猜测:notify 在每个通过的文件上运行。在这种情况下,您既有 CSS 文件又有源映射文件。 - Heikki
也许我只是不理解管道的工作原理,但我认为除了传递的 CSS 文件之外,创建的 sourcemap 不会通过管道传递。 - jonhobbs
源代码映射已经存在。您可以使用.pipe(notify('<%= file.relative %>'))查看它。 - Heikki
1个回答

19

如果您只想在流中收到一条单独的通知,请使用 gulp-notify 的 onLast 选项:

//...
.pipe(notify({message: 'Css created', onLast: true}));

非常方便。您能否确认输出日志只是告诉我它正在运行SASS然后DEFAULT,而不是两次运行sass任务(因为它是默认的一部分)。 - jonhobbs
default 任务是您定义的一个空任务,因此 gulp 首先运行 default 任务的依赖项,然后运行您的空 default 任务。如果它运行了两次 sass,则在输出中会看到两次运行。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接