nodejs自动导出文件夹并生成压缩包

因为项目在内网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;

我的公众号:归园田居 每日分享前端知识与资讯~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值