包含/不包含 gulp.src 的通配符

3

我正在尝试为我的JavaScript concat构建任务在gulp中设置全局数组。目录结构如下:

├── 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

文件的顺序很重要:

  1. generated/header.js
  2. app.js
  3. 除了下面列出的文件之外的任何*.js文件
  4. generated/templates.js
  5. generated/footer.js

我已经疯狂地尝试了各种通配符的组合,但是我的 globbing 技能不强。

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

所以,如何在包括所有*.js文件的前提下排除来自子目录的文件?
谢谢。
1个回答

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);
    }));
});

运行它:

∴ 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

主要的技巧是避免在包含文件时在glob的开头使用 "!" 字符。
https://github.com/isaacs/minimatch#comparisons-to-other-fnmatchglob-implementations
"如果模式以!字符开头,则该模式将被否定。"
附注:否定的glob放置位置无关紧要。它们总是被悄悄地移到末尾。

请注意 - 任何第一个字符不是 '!' 的 glob 都使用 node-glob 进行 glob 匹配,而不是 minimatch,并且 node-glob 否定 "在版本 5 中已被弃用,并将在版本 6 中完全删除"。因此像 './!(generated)/**/*.js' 这样的 glob 在版本 6 中无法工作(至少据我所知)。 - Codebling
第二点:否定的通配符并不总是被移动到末尾。它们按顺序进行过滤。请查看源代码 - Codebling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接