node 打包包含项目名称加上MD5的zip包

517 阅读2分钟
const fs = require('fs');
const archiver = require('archiver');
const crypto = require('crypto');

// 读取package.json文件以获取项目名称
const name = require('../package.json').name

// 指定要读取的目录和生成的zip文件名
const sourcePath = '../dist';
const zipFileName = './files.zip';

// 创建一个输出流,用于写入zip文件
const output = fs.createWriteStream(zipFileName);

// 创建一个archiver实例,用于生成zip文件
const archive = archiver('zip', {
    zlib: { level: 9 }
});

// 监听输出流的close事件,打印生成的zip文件大小
output.on('close', function() {
    console.log('生成的zip文件大小为:', archive.pointer(), '字节');
});

// 监听archiver实例的warning事件,打印警告信息
archive.on('warning', function(err) {
    if (err.code === 'ENOENT') {
        console.warn('警告:文件不存在 -', err.message);
    } else {
        throw err;
    }
});

// 监听archiver实例的error事件,打印错误信息
archive.on('error', function(err) {
    throw err;
});

// 计算文件的md5值
const hash = crypto.createHash('md5');

// 监听archive实例的data事件,计算数据的md5值
archive.on('data', (chunk) =>{
    hash.update(chunk);
});

// zip文件生成完成后,将其重命名为项目名称加上md5值的形式
archive.on('end', function() {
    const md5 = hash.digest('hex');
    fs.rename(zipFileName, '../' + name + '.' + md5 + '.zip', () => {
        console.log('ok')
    });
});

// 将指定目录下的所有文件添加到zip文件中
archive.directory(sourcePath, false)

// 将zip文件输出到输出流中
archive.pipe(output);

// 完成zip文件的生成
archive.finalize();

代码解释:

  1. 引入需要的Node.js核心模块:fsarchivercrypto
  2. 读取package.json文件以获取项目名称。
  3. 指定要读取的目录和生成的zip文件名。
  4. 创建一个输出流,用于写入zip文件。
  5. 创建一个archiver实例,用于生成zip文件。
  6. 监听输出流的close事件,打印生成的zip文件大小。
  7. 监听archiver实例的warning事件,打印警告信息。
  8. 监听archiver实例的error事件,打印错误信息。
  9. 计算文件的md5值。
  10. 监听archive实例的data事件,计算数据的md5值。
  11. zip文件生成完成后,将其重命名为项目名称加上md5值的形式。
  12. 将指定目录下的所有文件添加到zip文件中。
  13. 将zip文件输出到输出流中。
  14. 完成zip文件的生成。

以上是使用Node.js编写的代码,用于将文件打包成md5名称的zip包。该代码将读取指定目录下的所有文件,并将它们打包成一个zip文件,文件名为该zip包中所有文件的md5值。