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

Gulp打包:如何在压缩时将public目录下的文件移至Zip根目录?

解决Gulp打包时将public目录内容直接放到Zip根目录的问题

方案一:使用gulp-rename修改文件路径

  1. 安装gulp-rename依赖:
npm install gulp-rename --save-dev
  1. 在gulpfile.js中引入rename模块:
const rename = require('gulp-rename');
  1. 修改genPackage函数,添加路径重命名逻辑以移除文件路径中的public/前缀:
const info = require('./package.json');
const rename = require('gulp-rename');

//PROCESS PACKAGE
function genPackage(done) {
    //GET CURRENT DATE TO APPEND TO ZIP PACKAGES
    let cdate = new Date().toISOString().substr(0, 10);

    return src(paths.package.src)
        // 移除public目录前缀,将内容直接放到Zip根目录
        .pipe(rename(function(file) {
            if (file.dirname.startsWith('public/')) {
                file.dirname = file.dirname.replace('public/', '');
            } else if (file.dirname === 'public') {
                file.dirname = '';
            }
        }))
        .pipe(gzip(`${info.name}-${cdate}.zip`))
        .pipe(dest(paths.package.dest));
    done();
}

方案二:拆分流并设置base参数(更清晰)

这种方式将根目录文件和public目录文件分开处理,通过设置base参数直接控制输出路径:

  1. 安装merge-stream用于合并多个流:
npm install merge-stream --save-dev
  1. 在gulpfile.js中引入merge-stream:
const merge = require('merge-stream');
  1. 修改genPackage函数,拆分根目录和public目录的处理流:
const info = require('./package.json');
const merge = require('merge-stream');

//PROCESS PACKAGE
function genPackage(done) {
    //GET CURRENT DATE TO APPEND TO ZIP PACKAGES
    let cdate = new Date().toISOString().substr(0, 10);

    // 处理根目录需要打包的文件(排除public目录)
    const rootFiles = src([
        '**/*',
        '!.vscode',
        '!node_modules{,/**}',
        '!src{,/**}',
        '!package-lock.json',
        '!src/views/**/_arc{,/**}',
        '!gulpfile.js',
        '!package.json',
        '!webpack.config.js',
        '!webpack.config.prod.js',
        '!public{,/**}' // 排除public目录本身
    ], { base: '.' });

    // 处理public目录下的文件,设置base为public,输出时自动移除public前缀
    const publicFiles = src(['public/**/*'], { base: 'public' });

    // 合并两个流后打包
    return merge(rootFiles, publicFiles)
        .pipe(gzip(`${info.name}-${cdate}.zip`))
        .pipe(dest(paths.package.dest));
    done();
}

说明

两种方案都能实现需求:生成的Zip文件根目录会直接包含index.htm、css/、images/、js/,以及根目录下允许打包的其他文件,不再嵌套public文件夹。方案一适合在原有src路径基础上快速修改;方案二更清晰,避免路径冲突,推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:04:57