当前位置: 首页 > news >正文

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

上一篇,我们已经用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.exeUltimate Packer for eXecutablesCopyright (C) 1996 - 2023
UPX 4.2.1       Markus Oberhumer, Laszlo Molnar & John Reiser    Nov 1st 2023File 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 专栏

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux下内网穿透实现云原生观测分析工具的远程访问
  • JAVA集合学习和源码分析
  • 深入理解JVM虚拟机第二十二篇:详解JVM当中与操作数栈相关的字节码指令
  • 041:vue中 el-table每个单元格包含多个数据项处理
  • 第五章 nfs服务器
  • 安卓常见设计模式12------观察者模式(Kotlin版、Livedata、Flow)
  • Linux imu6ull驱动- led
  • vue项目pdf文件的预览
  • SpringData、SparkStreaming和Flink集成Elasticsearch
  • 在gitlab中指定自定义 CI/CD 配置文件
  • C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割
  • GEE案例——使用Sentinel-1 影像进行分析RVI指数进行计算
  • n-gram语言模型——句子概率分布计算与平滑
  • RPC 框架 openfeign 介绍和学习使用总结
  • C/C++输出硬币翻转 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
  • 【译】JS基础算法脚本:字符串结尾
  • $translatePartialLoader加载失败及解决方式
  • 【comparator, comparable】小总结
  • Angular数据绑定机制
  • Asm.js的简单介绍
  • Consul Config 使用Git做版本控制的实现
  • CSS 专业技巧
  • Docker: 容器互访的三种方式
  • ES2017异步函数现已正式可用
  • php面试题 汇集2
  • Spring框架之我见(三)——IOC、AOP
  • SQLServer之创建数据库快照
  • SQLServer之索引简介
  • Tornado学习笔记(1)
  • Webpack 4x 之路 ( 四 )
  • Web标准制定过程
  • 欢迎参加第二届中国游戏开发者大会
  • 解析 Webpack中import、require、按需加载的执行过程
  • 排序算法之--选择排序
  • 前端相关框架总和
  • 物联网链路协议
  • 详解移动APP与web APP的区别
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ​ArcGIS Pro 如何批量删除字段
  • ​zookeeper集群配置与启动
  • #if 1...#endif
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #在 README.md 中生成项目目录结构
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)socket Aio demo
  • (转)菜鸟学数据库(三)——存储过程
  • .htaccess配置重写url引擎
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core 控制台应用程序读取配置文件app.config
  • .NET NPOI导出Excel详解
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net解析传过来的xml_DOM4J解析XML文件