【问题标题】:Including/excluding globs for gulp.src包括/排除 gulp.src 的 glob
【发布时间】:2014-12-21 04:25:53
【问题描述】:

我正在尝试在 gulp 中为我的 javascript concat 构建任务设置一个 glob 数组。目录结构如下:

├── 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. 生成/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'
];

那么我如何包含所有*.js 文件,除了那些来自子目录的文件?

谢谢。

【问题讨论】:

    标签: javascript node.js gulp glob minimatch


    【解决方案1】:

    我想出的最好的:

    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

    “如果模式以 ! 字符开头,则它被否定。”

    ps。否定 glob 的放置无关紧要。他们总是在幕后移动到最后。

    【讨论】:

    • 小心这一点 - 任何第一个字符不是 '!' 的 glob使用 node-glob 进行 glob 匹配,而不是 minimatch,并且 node-glob 否定“在版本 5 中已弃用,将在版本 6 中完全删除”。因此,像 './!(generated)/**/*.js' 这样的 glob 在版本 6 中不起作用(至少,据我所知)。
    • 第二点:否定的 glob 并不总是移到最后。它们按顺序过滤。看看source
    猜你喜欢
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多