使用 gulp,监视任务是否保证在其他任务之前 运行?

With gulp, are watch tasks guaranteed to run before other tasks?

我有一个 gulp 监视任务,它使用 gulp-sass 将 SASS 转换为 CSS。对于开发,我只需要分隔 CSS 个文件。

为了发布,我有一个 min 任务,它使用 gulp-cssminconcat 来捆绑和缩小 CSS。但是,min 任务不处理 SASS 文件。它假定它们已经转换为 CSS.

这是一个有效的假设吗?如果自动构建获取最新的源代码(没有 .scss 文件)和 运行s min 怎么办?这里是否存在关于 watch 任务是否会 运行 及时 min 获取 SASS 文件的竞争条件?

如果您的 min 任务也在监视 SASS 文件,则您的假设不一定有效。默认情况下,所有任务将同时 运行。然而,您可以在您的任务中定义依赖关系,这样一个任务在另一个任务完成之前不会开始。这可以解决您的问题。有关依赖项的文档可以在 here.

中找到

还有另外两种解决方案:

  • 观看 min 任务的 CSS 个文件。
  • 运行 编译 SASS.
  • 任务结束时 min 任务中的逻辑

爱德华!最好使用可选的缩小来防止从磁盘额外读取。

var env = require('minimist')(process.argv.slice(2));
var noop = require('readable-stream/passthrough').bind(null, { objectMode: true });
gulp.task('style', function () {
  return gulp.src('...')
    .pipe(process())
    .pipe(env.min ? uglify() : noop())
    .pipe(gulp.dest('...'))
});

此外,我不推荐 gulp-util 中的这些工具,它们将被弃用

即使 gulp 保证它会在启动依赖任务之前等待监视任务完成,在从源文件更改到 OS 通知之间的时间间隔内仍可能发生竞争gulp。所以我决定不使用 SASS → CSS 转换输出。因为我很少需要构建最小化版本,所以节省这些毫秒没有任何回报。

相反,我使用 stream-combiner2 来重用转换逻辑:

var combiner = require('stream-combiner2');

function scssTransform() {
    return combiner(
        sourcemaps.init(),
        sass(),
        sourcemaps.write());
}

我将转换用于我的非模拟 "sandbox" 本地开发:

gulp.task('sandbox:css', function () {
    return gulp.src(paths.scss)
        .pipe(scssTransform())
        .pipe(gulp.dest(dirs.styles));
});

我在本地为站点提供服务的任务取决于并监视任务:

gulp.task('serve.sandbox', ['sandbox:css' /* ... more ... */], function () {
    // ... Start the web server ...
    gulp.watch(paths.scss, ['sandbox:css']);
    // ... Watch more stuff ...
});

我也将转换用于我的最小化部署:

gulp.task('deploy:css', function () {
    return gulp.src(paths.scss)
        .pipe(scssTransform())
        .pipe(concat(files.cssMin))
        .pipe(cssmin())
        .pipe(gulp.dest(dirs.deploy));
});