核心命令示例: go build -ldflags="-s -w -H windowsgui" main.go
前言:
本人是学了python再过来玩golang的,在python中,我能实现的最小打包方式,就是基于tkinter写GUI界面,然后用pyintaller打包工具进行打包,打包完毕后用upx软件进行压缩,完了后exe可执行文件的体积大概就是8m左右
实践:
那么golang打包exe文件的体积一般是多少呢?
经过测试,用官方的打包方式 go build packagename 比如go build main.go,其中我main.go代码如下:
package main
import (
"fyne.io/fyne/app"
"fyne.io/fyne/widget"
)
func main() {
app := app.New()
w := app.NewWindow("Hello")
w.SetContent(widget.NewVBox(
widget.NewLabel("Hello Fyne!"),
widget.NewButton("Quit", func() {
app.Quit()
}),
))
w.ShowAndRun()
}
代码参见:https://www.ctolib.com/fyne-io-fyne.html
打包后的应用体积为12MB
然后开启Upx软件,给压缩一下,大概搞掉了三分之二的体积,得到一个4MB的exe可执行文件
然后打开软件看看:
不尽人意的地方还是有两处,一,我这个是gui界面的,我不想要黑窗口啊。
二,我这个体积4MB还是有点大,能不能再小点。
so,再研究了一下官方的go build,发现有个-ldflags参数,可以实现这个效果:
怎么用呢?参见下面这行代码,在terminal或者cmd里面敲的
go build -ldflags="-s -w -H windowsgui" main.go
那么具体里面这段 -ldflags="-s -w -H windowsgui" 是什么意思呢?
-ldflags=“参数”: 表示将引号里面的参数传给编译器
-s:去掉符号信息 (这样panic时,stack trace就没有任何文件名/行号信息了,这等价于普通C/C+=程序被strip的效果)
-w:去掉DWARF调试信息 (得到的程序就不能用gdb调试了)
-H windowsgui : 以windows gui形式打包,不带dos窗口。其中注意H是大写的
这样操作完毕后,回头看一下打包的exe:
接着upx再来一下:
双击运行一下这个exe:
ok,正常运行并且没有dos窗口,然后体积还只能2423kb,比起最初的12271kb足足小了80%,因为12271*20%就是2423啊,哈哈我数学还行吧
如此说来是不是爽歪歪呢,那么我再看一下,还有没有可能精简大小呢
我们现在试试新建一个test.go,里面只写一个Hello world,然后打包带个dos再upx看看体积有多大
package main
import "fmt"
func main() {
fmt.Println("hell world\n按下回车键退出...")
fmt.Scanf("%s")
fmt.Println("结束")
}
这里用到输入是为了阻塞线程,要不然打包后执行exe就会发下dos窗口一闪而过就没了。
现在打包一下看看,打包最小的带黑窗口的:
go build -ldflags="-s -w " test.go
upX一下:
好了,这是我打包过的最小的go程序了,竟然才507kb.双击运行一下看看是否正常
启动后在阻塞状态,等待用户输入,然后按个回车键就运行完毕结束程序了。
所以总结了一下,引入的gui库,几行代码,2423kb的体积比这个500kb的原生dos程序到了1900多kb,说明这些多出来的体积都是gui库的,然后我们再想压缩这个体积,就只有一个方法了,那就是慢慢地去寻找有没有比这个库更小的,本次测试用的这个库是Fyne,因为我发现它在类似gui库中星数挺多,更新挺勤快的。后面有机会我还想测试一下qt之类的库。经过我的多次尝试,确实找到一个特别小的GUI库ndlabs,最后编译的exe经过upx后最小700kb,不过界面甚是原生。相关的用法我贴个地址吧:
https://www.jianshu.com/p/456f072f58af
运行图示:
去这个地址找同类go gui的对比,然后自己挑一个来测试
https://www.ctolib.com/article/compares/44408
好了,博客到此结束,不知道你是否学到了一点用GO做gui的想法呢。python都能做GUI,这里用Go来做,不乏是一个很好的尝试,因为打包的体积比python小啊,python最小8m,这个今天测试go的都才 2MB多点,而且python程序运行速度跟go比起来不是一个级别的,而且go语言打包的程序跟java一样,并不会被360等安全软件误报毒,是不是有点激动?
慢着,其实还没结束呢。因为我们现在搞出来的程序,没有图标,没有版权信息,那么该怎样加上呢?
其实很简单,编译好了,然后自己用外部工具给exe加上这些信息,然后再upx
这里推荐使用 ResourceHacker,自己百度一下下载就行了
现在看使用,先安装完了,然后打开后的首界面里面点击打开文件:
比如我现在打开了一个test.exe,然后该给他加版权信息了:
下拉列表选择VERSION_INFO,然后点Add
然后出来的这些东西自己看着编辑,也可以懒得改,不动它,然后先点绿色的运行按钮,完了在点保存
界面变成了这样:
接着选择添加图标资源:
一顿操作完毕,接着看我们那个exe程序:
图标也加上了,版权信息也加上了。这回真没有了。对了。补充说明,一定要go build出来后就把这些东西加了再用upx压缩,千万别先upx了再加,因为那样的程序我亲测是不能运行的。然后理论上这个方法是能改python里面用pyinstaller打包的exe的哦,只不过pyinstaller自带这种带图标打包的操作。在此也不多提,具体可以看我博客里Python相关内容
最后再补充,就是推荐用goland这款ide来写go项目。原因在于我是python过来的,用习惯了pycharm这款ide,正好goland和pycharm的操作一模一样。
用goland把编译exe命令加入到外部工具:
Arguments里面是 build -ldflags="-s -w -H windowsgui" $FileName$
然后在自己的main.go文件里面,点击goland菜单的外部工具:
然后就发现main.exe已经和源码躺在一起了。后面你只需要加个图标,版权,然后手动upx一下就能发布了。
很嗨皮哦!
有用记得点个关注,谢谢
最后安利一波全球最强的golang GUI快速开发库,利用拖拽生成GUI界面并且控件众多,体验很好。
国人良心开发,总项目代码超过40w行,虽然星星少了点,但是真的好用。然后就是这么生成的exe文件经过最优压缩,轻轻松松变成2.5mb左右的单文件体积,非常好使。
项目地址: https://github.com/ying32/govcl
喜欢的记得点个星