You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gulp 4如何将dir1、dir2目录同层打包为Zip(不含src)

不用临时目录的Gulp 4打包方案

嘿,我之前刚好解决过几乎一模一样的需求!不用折腾临时目录,直接通过Gulp的路径配置就能实现你要的效果,核心是利用gulp.src的base选项来控制文件在Zip包中的层级结构。

第一步:安装依赖

首先确保你已经安装了gulp-zip(如果没有的话):

npm install --save-dev gulp-zip

方案一:动态设置base路径(单流实现)

直接在一个gulp.src里匹配所有文件,通过base函数根据文件来源动态调整基准路径:

const gulp = require('gulp');
const zip = require('gulp-zip');

// 定义打包任务
function packageZip() {
  return gulp.src(
    [
      'dir1/src/**/*',   // 匹配dir1/src下的所有文件及子目录
      'dir2/**/*'        // 匹配dir2下的所有文件及子目录
    ],
    {
      // 动态设置base路径,控制压缩包中的文件层级
      base: (file) => {
        // 如果文件来自dir1/src,就把base设为dir1/src,这样打包时会去掉src目录
        if (file.path.includes('dir1/src')) {
          return 'dir1/src';
        }
        // 其他文件(来自dir2)的base设为根目录,直接放在Zip包的顶层
        return './';
      }
    }
  )
  .pipe(zip('final-package.zip'))  // 生成的Zip文件名
  .pipe(gulp.dest('./'));          // Zip包输出到项目根目录
}

// 导出任务,方便运行:gulp packageZip
exports.packageZip = packageZip;

方案二:合并两个流(更直观)

如果觉得动态base的写法不够清晰,也可以用merge2把两个独立的流合并,每个流单独设置自己的base:

先安装merge2:

npm install --save-dev merge2

然后编写任务:

const gulp = require('gulp');
const zip = require('gulp-zip');
const merge = require('merge2');

function packageZip() {
  // 处理dir1/src的文件,base设为dir1/src,去掉src层级
  const stream1 = gulp.src('dir1/src/**/*', { base: 'dir1/src' });
  // 处理dir2的文件,base设为根目录,直接放在顶层
  const stream2 = gulp.src('dir2/**/*', { base: './' });

  // 合并两个流后打包
  return merge(stream1, stream2)
    .pipe(zip('final-package.zip'))
    .pipe(gulp.dest('./'));
}

exports.packageZip = packageZip;

效果说明

运行gulp packageZip后,生成的final-package.zip里的结构会是:

final-package.zip
├── [dir1/src下的所有文件和子目录]
└── [dir2下的所有文件和子目录]

完全符合你要的“同一层级且不包含src目录”的要求,而且全程不需要创建临时目录,更高效简洁。

内容的提问来源于stack exchange,提问作者chepukha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:16:38