Gulp globbing排除文件然后不包括不按照描述工作

时间:2016-06-06 18:11:30

标签: gulp gulp-glob

如果我有文件

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

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

1 个答案:

答案 0 :(得分:0)

这不是一个错误,文档是错误的。 gulp的最新版本为gulp@3.9.1,使用vinyl-fs@0.3.14vinyl-fs@1.0.0之前没有引入behavior you're referring to

事实上,在其他地方gulp docs explicitly state,整数排序将是gulp@4.0.0中的新功能:

  

传递给gulp.src的globs将按顺序进行评估,这意味着可以gulp.src(['*.js', '!b*.js', 'bad.js'])(排除以b开头的每个JS文件,除了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'));
});