1. 前言

本文讨论使用 GoReleaser 优化二进制产物的体积。

通常直接使用 go build 构建出来的二进制包含了符号表和调试信息,所以体积会比较大,比如我之前写的一个 CLI 工具 mdfmt 在优化之前的二进制体积为 20M。

Untitled

优化之后,体积变为了 4.7M,体积降低了 76.5%:

Untitled

2. 优化方案

2.1 编译参数

Go 编译器默认编译出来的程序会带有符号表和调试信息,一般来说 release 版本在 build 时可以通过添加 -ldflags="-s -w" 编译参数去除调试信息以减小二进制体积。

$ go build -ldflags="-s -w" main.go

2.2 使用 upx 压缩

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

通过各系统的包管理工具一般可以自动安装 UPX。例如 Centos 上 epel 库 yum install -y upx,MacOS 上可以通过 brew 安装 brew install upx

另外也可以直接去 github release 页面下载各个平台的二进制程序。

使用

upx 有很多参数,最重要的则是压缩率,1-91 代表最低压缩率,9 代表最高压缩率。