gulp.src 使用同步通配

gulp.src using sync globbing

我查看了 gulp.src() 的来源,显然它只是对 require('vinyl-fs').src() 的引用。查看 vfs src() 的文档,它说它接受它定义的任何选项,以及 "any glob-related options are documented in glob-stream and node-glob." 根据 node-glob 的文档,我可以传递选项 { sync: true }.

当我尝试使用 gulp.src(..., { sync: true }) 时,我从 gulp:

得到这个错误
TypeError: Object #<GlobSync> has no method 'on'

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

如果您需要按特定顺序排列文件,请使用 gulp-sort (alphabetical etc.) or gulp-order (globs)。

有关背景信息,请参阅此问题:https://github.com/gulpjs/gulp/issues/687

仍然 运行 使用 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));
};

我有以下解决方案,我应用 gulp.srcgulp-order on each glob individually and use 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 都按固定(字母顺序)顺序排序,并合并连接流。

缺点:路径必须不相交,并且不可能求反。

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

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