减小 golang 编译出程序的体积

Go 语言的优势是可以很方便地编译出跨平台的应用程序,而不需要为每一个平台做代码适配,也不像 JAVA 一样需要预先安装 JDK 环境。相应的问题就是 go 编译出的程序体积较大,和 c/c++ 不同,它将大多数依赖都以静态编译的方式编译进了程序中。为什么要缩减Golang编译后的文件大小呢?不缩减可不可以呢。正常来说一般服务器硬盘资源相对来说都比较充足,但如果类似共享设备,嵌入式设备上,硬盘资源相对来说就不是那么充足,这时就需要我们斤斤计较文件大小了。

压缩可执行文件

指定编译参数 -ldflags

go build 编译程序时可以通过 -ldflags 来指定编译参数。

-s 的作用是去掉符号信息。 -w 的作用是去掉调试信息。

测试加与不加 -ldflags 编译出的应用大小。

1
2
3
4
5
6
7

go build -o tmp/olaindex ./cmd/olaindex
-rwxr-xr-x 1 fate staff 33056092 Dec 10 15:49 olaindex

go build -ldflags "-s -w" -o tmp/olaindex_opt ./cmd/olaindex
-rwxr-xr-x 1 fate staff 14181376 Dec 10 15:49 olaindex_opt

减小了接近 50% 的体积。

UPX 压缩

UPX (the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70% ,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。 通过 UPX 压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行,对于支持的大多数格式没有运行时间或内存的不利后果。 UPX 支持许多不同的可执行文件格式 包含 Windows 95/98/ME/NT/2000/XP/CE 程序和动态链接库、DOS 程序、 Linux 可执行文件和核心。

通过各系统的包管理工具一般可以自动安装 UPX

-o 指定压缩后的文件名。 -9 指定压缩级别,1-9

1
2
3
upx -9 -o .\tmp\olaindex_upx.exe .\cmd\olaindex_opt.exe

-rwxr-xr-x 1 fate staff 4831744 Dec 10 15:49 olaindex_upx

可以看到文件又缩小了接近1/3,效果十分显著,有需要的赶紧试试吧。。

需要注意的是,UPX 可能并不能正确的压缩所有平台的程序,压缩完成后最好自行在对应平台运行测试一下。

Linux、Win 系统下 UPX 下载地址