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.src
和 gulp-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);
我查看了 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.src
和 gulp-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);