如何在单个Gulp任务中处理多动态流 实现基于JSON的文件复制
问题原因
你的代码存在3个核心错误导致任务无法正常完成:
TOOLS_DIST_PATH.map回调中额外包裹了一层未执行的匿名函数,生成流、添加到merge的逻辑从来没有实际运行,最终返回的合并流为空,Gulp无法检测到任务结束信号- 不需要用
new stream()包装gulp.src返回的流,gulp.src本身输出的就是标准Node流实例,多余的包装会导致流逻辑异常 merge-stream实例在全局提前创建,多次运行任务时会复用旧实例的残留内容,引发不可预知的错误
修复后完整代码
const DEV_PATH = "./dev/"; const DIST_PATH = "./dist/"; const DEV_PATH_TOOLS = DEV_PATH + "tools/"; const DEV_PATH_COMMON = DEV_PATH + "common/"; const DIST_PATH_TOOLS = DIST_PATH + "tools/"; const TOOLS_DIST_PATH = [ { "dir" : 'dir1', "options" : { "class" : [ "modules/csv/**/*" ] } }, { "dir" : 'dir2', "options" : { "class" : [ "modules/csv/CsvImporter.php" ] } } ]; const gulp = require('gulp'); const plumber = require('gulp-plumber'); const merge = require('merge-stream'); // 复用plumber配置避免重复编写 const plumberConfig = { handleError: function (err) { console.log(err); this.emit('end'); } }; gulp.task( 'copy-class', function(){ const merged = merge(); TOOLS_DIST_PATH.map( t => { const stream = gulp.src( t.options.class.map( c => DEV_PATH_COMMON + c )) .pipe(plumber(plumberConfig)) .pipe( gulp.dest( DIST_PATH_TOOLS + t.dir + '/class' ) ); merged.add(stream); }); return merged.isEmpty() ? null : merged; }); gulp.task( 'default', gulp.series( 'copy-class' ) );
关键修改说明
- 移除了map回调中多余的匿名函数包装,直接执行流生成逻辑
- 把
merge-stream的实例化移到任务内部,每次运行任务都创建新的合并实例 - 移除了无效的
new stream()流包装,直接使用gulp.src返回的原生流 - 抽离了重复的plumber配置,简化代码结构
内容的提问来源于stack exchange,提问作者J.BizMai
相关产品推荐
相关产品推荐

