因为项目在内网svn上需要权限才能访问,因此每次跟第三方同步个别项目代码都很痛苦,试过git等方式,也不太理想第三方不一定熟悉操作还需要指导费时费力,因此使用nodejs封装一个插件,来自动导出项目压缩包,第一次使用需要修改下target里的目录地址,后续每次只需在命令行执行即可直接在桌面生成压缩包
安装依赖
依赖的库只有 archiver 这个
直接 在需要的项目 npm install archiver
即可
这个库的文档地址
https://github.com/archiverjs/node-archiver
使用方法
将需要导出的目录添加到target数组中 命令行执行 node export-zip.js
(node后边是这个文件的路径)即可
核心代码 export-zip.js 内容
/**
* @author 凌晨
* @description
* 快速导出压缩包 需要安装依赖 npm install archiver
* 这个库的文档地址 https://github.com/archiverjs/node-archiver
*
* 使用方式
* 1. 将需要导出的目录添加到target数组中 命令行执行 node export-zip.js
* 2. 命令行执行 node export-zip.js 路径1 路径2
*
* 如果act下目录与活动目录相同则可以省略,会自动进行补全(只在传了一个路径的情况下有效,多个路径时需要全部填写)
* 如需配置生成路径或文件名, 请修改常量output
*
* @version 20231205
* 更新内容
* 兼容绝对路径
* 支持命令行入参 自动补全act路径
*/
const fs = require('fs');
const archiver = require('archiver');
const print = require('./print');
const os = require('os');
const homedir = os.homedir();
const timeString = new Date().toLocaleDateString().replace(/\//g, '-');
//使用方式1:获取命令行参数 优先级最高
let params = process.argv.length > 2 && process.argv.filter((v, i) => i >= 2) ;
//使用方式2:配置要打包的路径列表,需要打包的目录添加到数组里面即可 相对路径
const target = ['tlhj/feedback/20231127/', 'act/tlhj/feedback/20231127/']
// 补全act路径
function repairPath(arr) {
if (arr.length < 2 && arr[0].indexOf('act') === -1) {
arr.push('act/' + arr[0]);
}
return arr;
}
// 默认在桌面生成此文件 activity-ui+日期.zip
const output = fs.createWriteStream(homedir + '/Desktop/activity-ui' + timeString + '.zip');
const archive = archiver('zip', {
zlib: { level: 9 } // 设置压缩级别
});
archive.on('error', function (err) {
throw err;
});
output.on('close', function () {
print(`
压缩完毕
压缩目录列表:${(params || target).join(',')}
生成文件大小${(archive.pointer() / 1024 / 1024).toFixed(1)}MB
请在桌面查找activity-ui${timeString}.zip
`);
});
archive.pipe(output);
let real = repairPath(params || target);
for (i of real) {
if (i.startsWith('/')) i = i.substr(1);
archive.directory(i, i)
}
archive.finalize();
print.js
function print(msg) {
const start = '************************************** 运行结果 **************************************',
end = '**************************************** 结束 ****************************************',
baseLength = end.length - 5;
// 补齐每行的长度
const line = msg.split('\n').map(v => {
if (v.length && v.length < baseLength) {
var a = Math.abs(v.length - baseLength) / 2;
v = "\x20".repeat(a) + v + "\x20".repeat(a);
}
return v;
});
// 开始输出
console.log('\x1b[7m\x1b[36m');
console.log(start);
console.log(line.join('\n'));
console.log(end);
console.log('\x1b[0m');
}
module.exports = print;
我的公众号:归园田居 每日分享前端知识与资讯~