Gulp打包:如何在压缩时将public目录下的文件移至Zip根目录?
解决Gulp打包时将public目录内容直接放到Zip根目录的问题
方案一:使用gulp-rename修改文件路径
- 安装gulp-rename依赖:
npm install gulp-rename --save-dev
- 在gulpfile.js中引入rename模块:
const rename = require('gulp-rename');
- 修改
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参数直接控制输出路径:
- 安装merge-stream用于合并多个流:
npm install merge-stream --save-dev
- 在gulpfile.js中引入merge-stream:
const merge = require('merge-stream');
- 修改
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
相关产品推荐
相关产品推荐

