2

如果我有文件

client/
  a.js
  bob.js
  bad.js

和吞咽任务

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

然后根据文档我们应该复制a.jsbad.js. 但是,当我使用 gulp v3.9.1 运行它时,它只会复制a.js.

这是一个已知的错误?有没有办法做到这一点?

4

1 回答 1

0

这不是错误,文档只是错误的。gulp 的最新版本是gulp@3.9.1使用vinyl-fs@0.3.14. 您所指的行为直到vinyl-fs@1.0.0.

事实上,gulp 文档在其他地方明确指出 glob 排序将是一个新特性gulp@4.0.0

传递给 gulp.src 的 glob 将按顺序进行评估,这意味着这是可能的(排除所有以除 bad.jsgulp.src(['*.js', '!b*.js', 'bad.js'])开头的 JS 文件)b

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

一种解决方法是继续使用 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'));
});
于 2016-06-06T19:46:50.947 回答