Gulp 个任务不等待另一个,不是 运行 个系列

Gulp tasks not waiting for another, not running in series

我有以下 gulp 文件:

'use strict';

var gulp = require('gulp');
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rev = require('gulp-rev');
var usemin = require('gulp-usemin');
var ngmin = require('gulp-ngmin');
var path = require('path');
var rimraf = require('gulp-rimraf');


var bases = {
 app: 'app/',
 dist: 'dist/'
};

var paths = {
  scripts: ['scripts/**/*.js', '!scripts/libs/**/*.js'],
  styles: ['styles/**/*.css'],
  html: ['index.html', '404.html'],
  views: ['views/**/*.html']
};


gulp.task('copy', function() {
  return gulp.src(paths.views, {cwd: bases.app, read:false})
  .pipe(gulp.dest(bases.dist + '/views/'));
});

gulp.task('clean', function() {
  return gulp.src(bases.dist, { read: false }) // much faster
    .pipe(rimraf());
});


gulp.task('usemin', [], function () {
  return gulp.src('./*.html', {cwd: bases.app})
    .pipe(usemin({
      js: [/*uglify(), rev()*/]
    }))
    .pipe(gulp.dest(bases.dist));
});

// Rerun the task when a file changes
gulp.task('watch', function() {
  gulp.watch(path.join(bases.app, paths.scripts[0]), ['usemin']);
});

gulp.task('default', ['clean', 'usemin', 'copy']);

根据文档,像我一样返回流,在 clean 任务中,copyusemin 应该等待 clean 完成。

正如您从控制台中看到的那样,它们没有

[23:33:22] Starting 'clean'...
[23:33:22] Starting 'usemin'...
[23:33:22] Starting 'copy'...
[23:33:22] Finished 'clean' after 82 ms
[23:33:22] Finished 'copy' after 9.92 ms
[23:33:22] Finished 'usemin' after 200 ms
[23:33:22] Starting 'default'...
[23:33:22] Finished 'default' after 9.76 μs

预期结果类似于:

[23:33:22] Starting 'clean'...
[23:33:22] Finished 'clean' after 82 ms
[23:33:22] Starting 'usemin'...
[23:33:22] Starting 'copy'...
[23:33:22] Finished 'copy' after 9.92 ms
[23:33:22] Finished 'usemin' after 200 ms
[23:33:22] Starting 'default'...
[23:33:22] Finished 'default' after 9.76 μs

所以,我做错了什么?

多亏了 zaynetro 的提示,我明白了..

gulp.task('default', ['clean', 'usemin', 'copy'], function() {})的语法只是意味着,default依赖于cleanusemincopy,不管它们的顺序如何。它们都将同时处理。

如果你真的想控制任务执行顺序,你必须把它分解成依赖于 clean 的子任务,在我的例子中是这样的:

'use strict';

var gulp = require('gulp');
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rev = require('gulp-rev');
var usemin = require('gulp-usemin');
var ngmin = require('gulp-ngmin');
var path = require('path');
var rimraf = require('gulp-rimraf');


var bases = {
 app: 'app/',
 dist: 'dist/'
};

var paths = {
  scripts: ['scripts/**/*.js', '!scripts/libs/**/*.js'],
  styles: ['styles/**/*.css'],
  html: ['index.html', '404.html'],
  views: ['views/**/*.html']
};


gulp.task('copy', ['clean'], function() {
  return gulp.src(paths.views, {cwd: bases.app, read:false})
  .pipe(gulp.dest(bases.dist + '/views/'));
});

gulp.task('clean', function() {
  return gulp.src(bases.dist, { read: false }) // much faster
    .pipe(rimraf());
});


gulp.task('usemin', ['clean'], function () {
  return gulp.src('./*.html', {cwd: bases.app})
    .pipe(usemin({
      js: [/*uglify(), rev()*/]
    }))
    .pipe(gulp.dest(bases.dist));
});

// Rerun the task when a file changes
gulp.task('watch', function() {
  gulp.watch(path.join(bases.app, paths.scripts[0]), ['usemin']);
});

gulp.task('default', ['usemin', 'copy']);