最近项目中的Node版本升级到了8.x,导致在将某个文件夹打包的过程中失败了,之前用的是archiver这个库,在Node6.x版本中没啥问题,但到了Node8.x版本中就会出现下面的异常:
TypeError: Cannot read property 'pipesCount' of undefined
at module.exports.Readable.pipe (_stream_readable.js:545:16)
at module.exports.ZipArchiveOutputStream._smartStream (C:\Workbench\flood\node_modules\compress-commons\lib\archivers\zip\zip-archive-output-stream.js:184:11)
at module.exports.ZipArchiveOutputStream._appendStream (C:\Workbench\flood\node_modules\compress-commons\lib\archivers\zip\zip-archive-output-stream.js:96:20)
at module.exports.ArchiveOutputStream.entry (C:\Workbench\flood\node_modules\compress-commons\lib\archivers\archive-output-stream.js:88:10)
at module.exports.ZipStream.entry (C:\Workbench\flood\node_modules\zip-stream\index.js:138:49)
at Zip.append (C:\Workbench\flood\node_modules\archiver\lib\plugins\zip.js:53:15)
at Archiver._moduleAppend (C:\Workbench\flood\node_modules\archiver\lib\core.js:172:16)
at Archiver._onQueueTask (C:\Workbench\flood\node_modules\archiver\lib\core.js:370:8)
at C:\Workbench\flood\node_modules\async\dist\async.js:4069:9
at process (C:\Workbench\flood\node_modules\async\dist\async.js:2317:17)
又尝试了zip-archiver等类似的库发现也一样的结果,好像底层也是基于archiver来做的,无奈之下只有改变思路:利用Golang来自己写一个,然后调用Node的execFile来执行。
当然,用Golang来自己实现zip的压缩代码还是比较多的,所以为了节约时间,从Github上找到了一个封装好的库https://github.com/mholt/archiver,代码实现起来还是很简单的:
package main
import (
"flag"
"fmt"
"github.com/mholt/archiver"
)
func main() {
srcDir := flag.String("in", "", "target file/dir")
outDir := flag.String("out", "", "dest dir")
flag.Parse()
// fmt.Println("srcDir", *srcDir)
// fmt.Println("outDir", *outDir)
err := archiver.Zip.Make(*outDir, []string{*srcDir})
if err != nil {
panic(err)
}
}
将代码保存为zip.go, 然后编译go build zip.go
得到 zip.exe 文件,在Node中进行调用:
// 调用 zip.exe
execFile('./build/tools/zip.exe', ['-in', './dists/target/', '-out', './dists/dest.zip'], (error, stdout, stderr) => {
if (error) throw error;
console.log('archive file/dir success');
});
需要注意的是, execFile执行时传入的参数的格式,之前我写成了
['-in ./dists/target/', '-out ./dists/dest.zip']
一直报错,还以为是代码的问题,后来查看文档才知道,出入的参数格式有问题,应该要像下面这样传入才可以:
['-key1', 'value1', '-key2', 'value2',...]
改完之后,在windows平台上运行是没问题了,已经可以正常压缩文件了。