如何进行Go程序的打包发布

上一篇,我们已经用GoLand开发了第一个程序Hello Kitty,接下去,我们将完成Go程序的打包发布。

执行:

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调试信息、符号信息

bash 复制代码
 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到应用的当前目录下

执行命令:

bash 复制代码
 .\upx.exe -9 main.exe
bash 复制代码
.\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

参考:

Go - run、build、install 编译详解
猫轻王的博客Golang 专栏

相关推荐
陈随易1 分钟前
神级 Skill,让 AI 用 HTML 代替 Markdown 回复
前端·后端·程序员
Gopher_HBo1 分钟前
go tool trace 使用指南(Go 1.24)
后端
一条Go2 分钟前
能力套餐:菜单、权限、开通范围怎么拆成三层而不打架
后端·github·saas
dpharness2 分钟前
我给 DSH 装记忆插件,踩了五个坑,其中一个让我丢了一条记录
后端
就像楞次定律3 分钟前
【Linux 学习记之二】C++ 构建体系与底层链接机制的深度透视(2)
linux·后端
烬羽5 分钟前
LangChain v1 中间件实战:不碰主流程,也能给 Agent 装上"外挂"
后端·langchain·agent
泡海椒9 分钟前
jquick-pdf 生成征信报表(相关矩阵版):靛蓝主题报告里动态图与说明面板并排的实测笔记
后端
IT枫斗者枫哥11 分钟前
Java 退款请求超时,先查原单还是重试?
java·后端
特立独行的猫A15 分钟前
我用仓颉写了个多平台发文工具:一份 Markdown,一条命令发六个平台
java·后端·python
HUANGZHENXUAN12317 分钟前
代码解析(二):detect_video.py —— 一个纯函数 + 一段主循环
后端