Node.js + Golang 打包zip文件(夹)

Node.js + Golang 打包zip文件(夹)_第1张图片
gopher_head-min.png

最近项目中的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平台上运行是没问题了,已经可以正常压缩文件了。

你可能感兴趣的:(Node.js + Golang 打包zip文件(夹))