gulp.src使用同步通配符匹配

4
我查看了gulp.src()的源代码,它只是对require('vinyl-fs').src()的一个引用。根据vfs的src()文档,它可以接受它定义的任何选项,以及在glob-stream和node-glob中记录的与glob相关的选项。根据node-glob的文档,我可以传入选项{ sync: true }
但是,当我尝试使用gulp.src(..., { sync: true })时,我从gulp得到了这个错误:
TypeError: Object #<GlobSync> has no method 'on'

你知道如何使用gulp.src()指定sync选项吗?


你不可以这样做 :). 你能否详细说明一下为什么需要这样做呢? - Heikki
猜测一下:这是用于对结果进行排序吗? - Heikki
1
问题在于我运行了一个 gulp.src().pipe(concat()),由于我将 globbing 模式传递到 gulp.src() 中,并且匹配是异步返回的,因此 concat() 输出的顺序会不断变化。如果 glob-matching 默认是异步的,我不明白任何人如何依赖于 concat() 每次都按相同顺序进行连接。在我的机器上,glob 返回的文件顺序总是不同的,因此 concat() 将不会始终按相同顺序进行连接。这对于使用 gulp 的每个人来说不是一个巨大的问题吗?这个解释有意义吗? :) - core
是的,它确实可以,而我也有点预料到了。 - Heikki
3个回答

5

使用 gulp.src(filePatterns).pipe(order(filePatterns)) 时仍然遇到了问题。现在,每次运行 gulp 后,拼接输出的顺序都保持不变,但是拼接的顺序并不按照 filePatterns 数组文字所指定的顺序进行。也许我漏掉了什么。

无论如何,我最终实现了下面这个解决方法。现在,我不再使用例如 gulp.src(filePatterns) 的方式,而是使用 gulp.src(deglob(filePatterns)),可以每次获得相同的顺序,并按照 filePatterns 数组文字定义的顺序进行。

function deglob() {
    var syncGlob = require('glob').sync,
        patterns = _.flatten(arguments, true);

    return _.flatten(patterns.map(function(pattern) {
        return syncGlob(pattern).map(function(file) {
            return pattern.charAt(0) === '!' ? ('!' + file) : file;
        });
    }), true);
}

实际上,我已经完全停止使用gulp.src(),而是在所有地方都使用以下代码:

gulp.from = function () {
    return gulp.src(deglob(arguments));
};

1

这意味着我现在必须这样做:gulp.src(filePatterns).pipe(order(filePatterns)),以便每次都获得相同的顺序。 - core

0
我有以下解决方案,我使用gulp.srcgulp-order在每个glob上单独应用,并使用merge2来顺序合并流。
var order = require('gulp-order');
var merge = require('merge2');    

var paths = ['folder1/**/*', 'folder2/**/*'];

var streams = paths.map(function (path) {
    return gulp.src(path)
        .pipe(order([path]));
});

return merge.apply(this, streams);

这样,order() 确保每个单独的 glob 按照固定(字母)顺序排序,并且 merge 连接流。

缺点:路径必须是不相交的,否定是不可能的。

为了允许重叠,可以通过以下方式修改脚本将其他路径添加为否定。这也允许否定。

var paths = [['src/**/*.module.js'], ['src/**/*.js', '!src/**/*.module.js']];

var streams = paths.map(function (path) {
    return gulp.src(path)
        .pipe(order(path));
});

return merge.apply(this, streams);

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