压缩go build打包的可执行文件

gwpp · · 6605 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

最近在写一个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压缩,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的伪动态链接,有兴趣的同学可以研究一下。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:gwpp

查看原文:压缩go build打包的可执行文件

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6605 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传