美文网首页
Node.js + Golang 打包zip文件(夹)

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

作者: 路过麦田 | 来源:发表于2017-09-07 13:32 被阅读203次
    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文件(夹)

          本文链接:https://www.haomeiwen.com/subject/gqkijxtx.html