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();
代码解释:
- 引入需要的Node.js核心模块:
fs、archiver和crypto。 - 读取
package.json文件以获取项目名称。 - 指定要读取的目录和生成的zip文件名。
- 创建一个输出流,用于写入zip文件。
- 创建一个
archiver实例,用于生成zip文件。 - 监听输出流的
close事件,打印生成的zip文件大小。 - 监听
archiver实例的warning事件,打印警告信息。 - 监听
archiver实例的error事件,打印错误信息。 - 计算文件的md5值。
- 监听
archive实例的data事件,计算数据的md5值。 zip文件生成完成后,将其重命名为项目名称加上md5值的形式。- 将指定目录下的所有文件添加到zip文件中。
- 将zip文件输出到输出流中。
- 完成zip文件的生成。
以上是使用Node.js编写的代码,用于将文件打包成md5名称的zip包。该代码将读取指定目录下的所有文件,并将它们打包成一个zip文件,文件名为该zip包中所有文件的md5值。