You need to enable JavaScript to run this app. 如何在单个Gulp任务中处理多动态流 实现基于JSON的文件复制
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 16:54:07