Gulp globbing excluding files then unexcluding not working as described 不按描述工作

Gulp globbing excluding files then unexcluding not working as described

如果我有文件

client/
  a.js
  bob.js
  bad.js

和 gulp 任务

gulp.task('copy', function() {
  return gulp.src(['client/*.js', '!client/b*.js', 'client/bad.js'])
             .pipe(gulp.dest('public'));
});

那么根据documentation我们应该复制a.jsbad.js。但是,当我 运行 使用 gulp v3.9.1 时,它只会复制 a.js.

这是已知错误吗?有办法吗?

这不是错误,只是文档有误。 gulp 的最新版本是 gulp@3.9.1,它使用 vinyl-fs@0.3.14behavior you're referring to 直到 vinyl-fs@1.0.0 才被引入。

事实上,其他地方的 gulp 文档 explicitly state 表示 glob 排序将是 gulp@4.0.0 中的一个新功能:

globs passed to gulp.src will be evaluated in order, which means this is possible gulp.src(['*.js', '!b*.js', 'bad.js']) (exclude every JS file that starts with a b except bad.js)

这意味着您可以简单地使用 gulp (gulpjs/gulp#4.0) 的当前开发版本并利用新功能。但是请注意,在定义任务时,gulp 4.x 是 gulp 3.x 的 radically different

一种解决方法是继续使用 gulp 3.x 来定义任务,但使用最新版本的 vinyl-fs 来创建乙烯基流:

var vinylFs = require('vinyl-fs');

gulp.task('copy', function() {
  return vinylFs.src(['client/*.js', '!client/b*.js', 'client/bad.js'])
    .pipe(vinylFs.dest('public'));
});

如果您不想这样做,您可以随时使用 merge-stream 将多个流合并为一个流:

var merge = require('merge-stream');

gulp.task('copy', function() {
  return merge(gulp.src(['client/*.js', '!client/b*.js']),
               gulp.src(['client/bad.js']))
    .pipe(gulp.dest('public'));
});