【问题标题】:gulp.src using sync globbinggulp.src 使用同步通配符
【发布时间】:2015-04-13 17:50:24
【问题描述】:

我查看了gulp.src() 的来源,显然它只是对require('vinyl-fs').src() 的引用。查看 vfs 的 src() 的文档,它说它接受它定义的任何选项,以及“任何与 glob 相关的选项都记录在 glob-stream 和 node-glob 中。”根据node-glob的文档,我可以传入选项{ sync: true }

但是,当我尝试使用 gulp.src(..., { sync: true }) 时,我从 gulp 中收到此错误:

TypeError: Object #<GlobSync> has no method 'on'

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

【问题讨论】:

  • 你不能:)。你能详细说明你为什么需要它吗?
  • 一个猜测:是为了对结果进行排序吗?
  • 这个问题是我运行gulp.src().pipe(concat()),并且由于我将通配模式传递给gulp.src(),并且匹配是异步返回的,concat() 输出的顺序不断变化。如果默认情况下全局匹配是异步的,我不明白任何人都可以依赖concat() 每次都以相同的顺序连接。在我的机器上,glob 总是以不同的顺序返回它找到的文件,所以concat() 不会总是以相同的顺序连接。对于使用 gulp 的每个人来说,这不是一个 巨大 的问题吗?这种解释有意义吗? :)
  • 是的,确实如此,我有点期待。

标签: node.js npm gulp glob


【解决方案1】:

我有以下解决方案,我在每个 glob 上分别应用 gulp.srcgulp-order 并使用 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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您需要文件按特定顺序排列,请使用gulp-sort(字母等)或gulp-order(全局)。

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

      【讨论】:

      • 这意味着我现在必须(正确?)这样做:gulp.src(filePatterns).pipe(order(filePatterns)) 每次都获得相同的订单。
      猜你喜欢
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      相关资源
      最近更新 更多