包含/排除gulp.src的globs

nul*_*ull 3 javascript glob node.js minimatch gulp

我想设置为我的javascript CONCAT在建任务水珠阵列一饮而尽.目录结构如下所示:

??? about
?   ??? about.js
??? assets
??? contact
??? core
?   ??? navbar
?   ?   ??? navbar.js
?   ?   ??? navbar.test.js
?   ??? routing.js
?   ??? routing.test.js
?   ??? utils.js
?   ??? utils.test.js
??? generated
?   ??? footer.js
?   ??? header.js
?   ??? templates.js
??? home
??? app.js
??? config.js
Run Code Online (Sandbox Code Playgroud)

文件的顺序很重要:

  1. 生成/ header.js
  2. app.js
  3. 任何*.js文件,除了下面的那些
  4. 生成/ templates.js
  5. 生成/ footer.js

我已经疯狂地尝试了各种通配符的组合,但对我来说并不强烈.

var inputFiles = [
  'generated/header.js',
  'app.js',
  '!(generated)**/*.js',    // <=---- ???
  'generated/templates.js',
  'generated/footer.js',
  '!**/*.test.js'
];
Run Code Online (Sandbox Code Playgroud)

那么如何包含*.js除子目录以外的所有文件?

谢谢.

Hei*_*kki 6

我想出的最好的:

var gulp = require('gulp');
var tap = require('gulp-tap');

gulp.task('default', function() {
    return gulp.src([
        'generated/header.js',
        'app.js',
        '*.js',
        './!(generated)/**/*.js', // <- All subdirs except 'generated'
        'generated/{templates,footer}.js',
        '!**/*.test.js',
        '!node_modules/**'
    ]).pipe(tap(function(file) {
        console.log(file.path);
    }));
});
Run Code Online (Sandbox Code Playgroud)

运行它:

? glob-test gulp
[20:07:51] Using gulpfile ~/Desktop/glob-test/gulpfile.js
[20:07:51] Starting 'default'...
/Users/heikki/Desktop/glob-test/generated/header.js
/Users/heikki/Desktop/glob-test/app.js
/Users/heikki/Desktop/glob-test/config.js
/Users/heikki/Desktop/glob-test/gulpfile.js
/Users/heikki/Desktop/glob-test/about/about.js
/Users/heikki/Desktop/glob-test/core/routing.js
/Users/heikki/Desktop/glob-test/core/utils.js
/Users/heikki/Desktop/glob-test/core/navbar/navbar.js
/Users/heikki/Desktop/glob-test/generated/templates.js
/Users/heikki/Desktop/glob-test/generated/footer.js
[20:07:51] Finished 'default' after 326 ms
Run Code Online (Sandbox Code Playgroud)

主要技巧是避免"!" 包含文件时在glob开头的字符.

https://github.com/isaacs/minimatch#comparisons-to-other-fnmatchglob-implementations

"如果模式以!字符开头,那么它就会被否定."

PS.否定球的放置无关紧要.他们总是在幕后移动到最后.