用途:在不悄然改变运行时行为、崩溃诊断、来源信息、签名或打包保证的前提下,缩减 Go 二进制体积,并以可测量的体积收益为目标。
主要能力:内置脚本 collect-build-context.sh、analyze-project.sh ./...、reproducible-build.sh、measure-binary-size.sh、compare-size-report.sh,分别用于收集构建事实、分析项目、生成可复现基线、测量体积与对比前后结果。默认流程为:先收集构建事实并阅读 references/build-inputs.md;构建可复现基线;测量产物;再按类别逐项应用改动,每步重建、重测并对比。
优化顺序:发布剥离,应用 -ldflags="-s -w" 与 -buildvcs=false,通常是最大收益,原始体积约减 25-35%,压缩后 45-60%;Go 1.22+ 中 -s 隐含 -w,仍保留 -s -w 以提高明确性。内联预算,-gcflags=all=-l 关闭内联,通常再省 5-10 个百分点原始体积,代价是运行时性能下降,延迟敏感路径应跳过并对比测量。运行时与平台裁剪,默认 CGO_ENABLED=0 并配合 -tags netgo,osusergo,三者需同时应用;若项目明确使用 CGO_ENABLED=1 或外部链接则保持启用;CGO 必须启用且编译 C 源码时,可应用 CGO_CFLAGS="-Oz",通常省 1-2% 原始体积。仓库专用构建标签,务必检查 goreleaser、Makefile、Dockerfile、CI、scripts 中的 -tags,并搜索 //go:build 约束,应用禁用可选重型特性的标签。结构调整,处理副作用导入、反射、模板、插件、时区数据与嵌入资源。专家路径,在前述层级测量后再评估 garble -tiny、UPX、TinyGo 或架构与打包变更。
硬性规则:不得将编译器内部 hack 作为常规生产建议;不推荐或应用 -gcflags=all=-B、-wb=false、链接器补丁、函数名剥离或签名后二进制补丁;PGO 视为性能工作而非体积工作;签名或公证后不得运行 UPX 等压缩器,UPX 在 macOS 上不可用。不得在未验证运行时行为的情况下禁用 cgo、切换解析器行为或添加构建标签;CGO_ENABLED=0 对某些项目反而增大体积。不得仅凭原始字节宣称成功,需同时测量原始体积、压缩体积与相关运行时行为。binsize 诊断不等于缺陷或自动修改,需确认其影响目标二进制并测量改动。
快速判断:若剥离即获得大部分收益,问题多为元数据;若剥离几乎无效,优先检查依赖与包拓扑;若压缩体积基本不变,后置压缩器大概率帮助有限;Wasm 或嵌入式目标更早考虑 TinyGo;macOS 目标不可用 UPX,只做签名前改动;存在 plugin、reflect、text/template、html/template 时死代码消除较弱;始终检查发布构建配置中已有的标签与标志。
适用场景:CLI、守护进程、库、插件、Wasm 目标与打包应用的体积缩减。限制:技能资料未提供具体价格、收费或平台支持范围;相关事实暂未提供。