UNPKG

2.54 kBJavaScriptView Raw
1import path from "path";
2import fs from "fs";
3import archiver from "archiver";
4import crypto from "crypto";
5import glob from "glob";
6
7// 将js文件先打tar包再打zip包
8export default function tarzip(file, dirs, output, zipname){
9 return new Promise(function(resolve, reject){
10 var dir = path.dirname(file);
11
12 var tarfile = path.join(dir, zipname + ".tar");
13 var zipfile = path.join(output, zipname + ".zip");
14
15 var tarwrite = fs.createWriteStream(tarfile);
16 // 打tar包
17 let tar = archiver('tar');
18 tar.on('error', function(err){
19 throw err;
20 });
21 tar.file(file, {
22 name: file.substring(file.lastIndexOf(path.sep) + 1)
23 });
24 // 将目录中的文件按照一定顺序加入tar包中
25 var files = [];
26 dirs.forEach((dir) => {
27 var dirname = dir.substring(dir.lastIndexOf(path.sep) + 1);
28 files = files.concat(glob.sync("**/*", {
29 cwd: dir,
30 nodir: true
31 }).map((file) => path.join(dirname, file)));
32 });
33 files = files.sort();
34
35 var dir = path.dirname(file);
36 // 经过测试,即使添加file排过序,依然有一定概率打出来的tar包不一样
37 // 所以每添加一个文件就等待10ms
38 (function _(){
39 if(files.length){
40 let file = files.shift();
41 tar.file(path.join(dir, file), {
42 name: file
43 });
44 setTimeout(function() {
45 _();
46 }, 10);
47 }else{
48 tar.finalize();
49 }
50 })();
51 tar.pipe(tarwrite);
52
53 tarwrite.on("close", function(){
54 // 生成tar包的md5值
55 var tarContent = fs.readFileSync(tarfile);
56 var md5 = crypto.createHash('md5');
57 md5.update(tarContent);
58 md5 = md5.digest('hex');
59
60 var tarread = fs.createReadStream(tarfile);
61 var output = fs.createWriteStream(zipfile);
62 // 打zip包
63 let zip = archiver('zip');
64 zip.on('error', function(err){
65 throw err;
66 });
67
68 zip.append(tarread, {
69 name: zipname + ".tar"
70 });
71 zip.pipe(output);
72
73 zip.finalize();
74
75 output.on("close", function(){
76 fs.unlink(tarfile);
77 resolve(md5);
78 });
79 });
80 });
81}
\No newline at end of file