在golang项目中, 最终运行的是打包好的二进制文件,如何才能让这个文件尽可能的小呢?
1.编译阶段的参数处理
go build
使用的是静态编译,会将程序的依赖一起打包,这样一来编译得到的可执行文件可以直接在目标平台运行,无需运行环境(例如 JRE)或动态链接库(例如 DLL)的支持。
使用ldflags传递参数:
在程序编译的时候可以加上-ldflags "-s -w"
参数来优化编译,原理是通过去除部分链接和调试等信息来减小编译生成的可执行程序体积,具体参数如下:
-
-a
:强制编译所有依赖包 -
-s
:去掉符号表信息,不过panic
的时候stace trace
就没有任何文件名/行号信息了 -
-w
:去掉DWARF
调试信息,不过得到的程序就不能使用gdb
进行调试了
可以看到添加-s
参数时,可执行文件体积减小最多
若对符号表无需求,-ldflags
直接添加"-s"
即可
2.使用压缩工具upx
github: https://github.com/upx/upx
[安装]
# mac
brew install upx
# centos
yum install upx
# debian/ubuntu
apt install upx-ucl
[使用]
# 压缩
upx app
# 解压缩
upx -d app
本地测试整体体积会减少一半左右, 至少压缩在30%以上的 , 且压缩后运行没有任何问题
下面是upx
的一些常用参数:
-
-o
:指定输出的文件名 -
-k
:保留备份原文件 -
-1
:最快压缩,共1-9
九个级别 -
-9
:最优压缩,与上面对应 -
-d
:解压缩decompress
,恢复原体积 -
-l
:显示压缩文件的详情,例如upx -l main.exe
-
-t
:测试压缩文件,例如upx -t main.exe
-
-q
:静默压缩be quiet
-
-v
:显示压缩细节be verbose
-
-f
:强制压缩 -
-V
:显示版本号 -
-h
:显示帮助信息 -
--brute
:尝试所有可用的压缩方法,slow
-
--ultra-brute
:比楼上更极端,very slow