上一篇,我们已经用GoLand开发了第一个程序Hello Kitty,接下去,我们将完成Go程序的打包发布。
执行:
go build -x main.go
go build 和 go run 在编译过程中其实是差不多的,不同之处是 go build 会生成编译好二进制文件并删掉编译过程产生的临时目录。若没有-o 指定文件名,则和当前目录名一致。
常用参数:
参数名 | 格式 | 含义 |
-o | -o file | 指定编译后二进制文件名 |
-a | -a | 强制重新编译涉及的依赖 |
-s | -s | 省略符号表并调试信息 |
-w | -w | 省略 DWARF 符号表 |
-p | -p | 指定编译过程中的并发数,默认为CPU数 |
-work | -work | 设置该参数后不会在程序结束后删掉编译的临时文件,可用于参看编译生成的文件 |
-n | -n | 加上该参数可以查看编译的过程,但不会继续执行编译后的二进制文件 |
-x | -x | 加上该参数可以查看编译的过程,会继续执行编译后的二进制文件 |
编译后文件体积过大解决方案 ,默认生成1.87M 的包main.exe。
优化方案
第一步:编译优化,说明:会去除 DWARF调试信息、符号信息
go build -ldflags "-s -w" main.go
变小了好多 只有1.27mb,但是要注意:
- -s 去掉符号表(这样 panic 时,stack trace 就没有任何文件名/行号信息了,这等价于普通C/C+=程序被strip的效果)
- -w 去掉 DWARF 调试信息,得到的程序就不能用 gdb 调试了
两个可以分开使用,实际项目中不建议做这些处理,多费点空间也没关系。
第二步:压缩优化
安装 UPX,并使用 最高级别的压缩
下载地址:https://github.com/upx/upx/releases,复制upx.exe到应用的当前目录下
执行命令:
.\upx.exe -9 main.exe
.\upx.exe -9 main.exe Ultimate Packer for eXecutables Copyright (C) 1996 - 2023 UPX 4.2.1 Markus Oberhumer, Laszlo Molnar & John Reiser Nov 1st 2023 File size Ratio Format Name -------------------- ------ ----------- ----------- 1339392 -> 531456 39.68% win64/pe main.exe Packed 1 file.
包体缩小到了519 KB
笔者从 1.87M → 1.27MB → 519 KB
总结
本文主要讲述了如何打包,如何对包体大小进行优化,下一篇,我们将讲述下GO模块引入指令Go Mod