## 前言
最近在写一个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
有疑问加站长微信联系(非本文作者))