美文网首页简书收藏--GOGo语言
压缩go build打包的可执行文件 —— 3.4MB ->

压缩go build打包的可执行文件 —— 3.4MB ->

作者: gwpp | 来源:发表于2017-08-18 00:52 被阅读1936次

    前言

    最近在写一个cli程序,习惯性的go build之后发现简简单单的几行代码打包出来就3.0+MB了,为此被做Python的同学嘲笑了很久,于是就研究了一下go build产生的可执行文件的压缩

    代码示例

    代码如下:

    package main
    import (
        "os"
        "gopkg.in/urfave/cli.v2"
    )
    const (
        APP_NAME    = "etcd-cli"
        APP_VERSION = "0.1"
        APP_USAGE   = "etcd-cli是一个简单实用的etcd命令行客户端,帮助你彻底解脱一次又一次的输入etcdctl"
    )
    func main() {
        app := new(cli.App)
        app.Name = APP_NAME
        app.Version = APP_VERSION
        app.Usage = APP_USAGE
        app.Action = action
        app.Run(os.Args)
    }
    func action(ctx *cli.Context) error {
        return nil
    }
    

    常规打包方法及结果

    $ go build
    $ ls -lh
    -rwxr-xr-x  1 gangan  staff   3.4M Aug 18 00:38 etcd-cli
    -rw-r--r--  1 gangan  staff   456B Aug 18 00:34 main.go
    

    可以看到,区区十几行代码什么都还没有实现, go build之后就得到了一个3.4MB的可执行文件,可想而知产品开发完后go build绝不会小,那么有没有解决办法呢?有,见下文。

    压缩可执行文件

    • 首先加上编译参数-ldflags

      $ go build -ldflags '-w -s'
      $ ls -lh
      -rwxr-xr-x  1 gangan  staff   2.5M Aug 18 00:45 etcd-cli
      -rw-r--r--  1 gangan  staff   456B Aug 18 00:34 main.go
      

      可以发现小了近1MB

    • 使用upx压缩,Linux、Mac和Win都有,这里以Mac为例

      $ brew install upx
      $ upx etcd-cli
      # 此处省略压缩时的打印...
      $ ls -lh
      -rwxr-xr-x  1 gangan  staff   897K Aug 18 00:49 etcd-cli
      -rw-r--r--  1 gangan  staff   456B Aug 18 00:34 main.go
      

      OK,可执行文件从3.4MB压缩到了897K,效果还是很明显的,有需要的赶紧试试吧。

    写在最后

    Golang开发的程序都会比较大,这是因为Golang是静态编译的,编译打包之后基本就不会再对其他类库有依赖了,所以会比较大。举个例子:C++程序可以调用dll,所以打包的时候可以不把dll打进去,包自然就小了。之前还有看到过有人使用GO -> C -- dll --> C -> GO的方式间接实现了Golang的伪动态链接,有兴趣的同学可以研究一下。

    补充

    Linux、Win 系统下 upx https://github.com/upx/upx/releases

    相关文章

      网友评论

      • freecast:如果Linux下也要3.4MB -> 897K的效果,有办法吗?
        freecast:@gwpp 嗯,谢谢。
        gwpp:可以的,upx有Linux版,链接:https://github.com/upx/upx/releases 。同样的步骤
        ```
        $ go build -ldflags '-w -s'
        $ upx etcd-cli
        ```
        刚才试了一下,上面的源文件在centos7.2上面 是从 4.5MB -> 863K
      • 622364ec1cf9:现在go在某些地方好像也默认用动态链接了,写个使用net/http包的程序编译后用ldd看一下就发现依赖了一些so库
        gwpp:试了一下,果然如此,涨姿势了,👍

      本文标题:压缩go build打包的可执行文件 —— 3.4MB ->

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