gulp.src (glob-stream) 负 glob 杀死匹配后的正 glob

gulp.src (glob-stream) positive glob after negative glob kills match

我的印象是 code 正 glob 只会受到紧随其后的负 glob 的限制。

那么

是怎么回事
gulp.src([
           '../WebContent/g/css/ng-client.css'
        ],{base: '../WebContent'}).pipe(using()) 

导致 ng-client.css 被列出。

同时

gulp.src([
           '!../WebContent/g/css/*',
           '../WebContent/g/css/ng-client.css'
        ],{base: '../WebContent'}).pipe(using())  

没有列出相同的文件?

我想弄清楚我对那些 glob 流的思考方式有什么问题导致我期望第二个代码块也 return 文件 - 而不是解决方法克服这种情况,我看到了像这样的建议: Glob / minimatch: how to gulp.src() everything, then exclude folder but keep one file in it

而且我知道我可以做类似的事情:

gulp.src([
       '!../WebContent/g/css/!(ng-client.css)',
       '../WebContent/g/css/ng-client.css'
    ],{base: '../WebContent'}).pipe(using())  

问题是为什么第二个 return 文件不像我期望的那样?

这很有趣。

您对 glob-stream 源代码的阅读似乎是正确的。它还与 glob-stream 本身的文档相匹配。但为什么 gulp 的行为与预期不同?我认为这是因为您不是 运行 您一直在阅读的代码。

即使是 gulp 的全新安装,您也没有使用最新版本的 glob-stream。这是我刚创建的项目中 npm list 的相关摘录:

├─┬ gulp@3.9.1
│ └─┬ vinyl-fs@0.3.14
│   ├─┬ glob-stream@3.1.18

这意味着正在使用 glob-stream@3.1.18。您链接的源代码来自 glob-stream@5.0.0

在 GitHub 上查看 glob-stream 的版本标签,文档中第一次提到 glob 顺序是在 4.0.1 中。所以看起来主要版本 3.x4.x.

之间的行为发生了向后不兼容的变化

我们可以直接通过运行glob-stream查看:

var gs = require('glob-stream');
gs.create([
  '!../WebContent/g/css/ng*',
  '../WebContent/g/css/ng-client.css'
]).pipe(using());

运行 这与 glob-stream@3.1.183.x 的最新版本)return 没有文件。 运行 它与 glob-stream@4.0.0 一起 return ng-client.css 文件。

让我感到奇怪的是 gulp documentation 明确提到了您一直期待的行为。但实际上 运行 他们在文档中使用的示例代码并没有产生他们声称的结果:

gulp.src(['client/*.js', '!client/b*.js', 'client/bad.js'])

运行 这与 gulp@3.9.1 只有 returns client/a.js,而不是 client/bad.js.

看来其他人也遇到了同样的问题。有一个名为 gulp-src-ordered-globs (which refers to this a GitHub issue) 的模块。使用此模块,您的示例和 Gulp.js 文档中的示例都按预期工作。

如果你真的想深入了解这一切,最好在 GitHub 或 ask somebody on the Gulp.js Gitter.

上打开一个问题