Go程序编译后如何缩减大小
序言
在前文 Mac及Linux 如何使用自动化脚本登录JumpServer堡垒机及后面的服务器 中我们提到,使用 python
的 onetimepass
可能会出现偶尔 otp 不正确的情形,比如会生成 5位数 的otp密码。因此可以使用 Go
语言的代替。
本文就使用 MFA
的实现代码进行缩减试验。
MFA 的 Go 代码
package main
import (
"fmt"
"os"
"github.com/spf13/viper"
"github.com/xlzd/gotp"
)
// 从 %HOME%/.mfa.yml 读取个人的跳板机配置秘钥生成与Google Authenticator 兼容的 MFA 一次性密码
func main() {
home, _ := os.UserHomeDir()
viper.AddConfigPath(".")
viper.AddConfigPath(home)
viper.SetConfigType("yml")
viper.SetConfigName(".mfa")
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Sprintf("Cannot reading from config file:%s", viper.ConfigFileUsed()))
}
s := viper.GetString("MFA_SECRET")
fmt.Println(gotp.NewDefaultTOTP(s).Now())
}
代码比较简单,从配置文件中读取 MFA_SECRET
然后生成 otp 密码并打印到控制台。
正常编译
go build .
无任何优化措施,编译的结果是 6.0MB
。
优化编译
go build -ldflags="-s -w" .
去除符号表及调试信息等,编译的结果是 4.2MB
,缩减了 30%
的样子。
upx 终极优化
使用 upx
这个可执行程序压缩工具进行优化。
Mac 平台安装 upx
brew install upx
然后使用 upx
对已经去除符号表及调试信息的版本进行打包优化
# -9标识优化级别,从 1-9,数字越大压缩率越高,压缩过程耗时越长
# 压缩 mfa-ld 这个程序,并输出到 mfa
upx -9 -o mfa mfa-ld
upx
这个版本将程序压缩到了 1.8MB
,只有最初版本的 30%
。
总结
整个 mfa
应用程序从最初的 6MB
压缩到 1.8MB
,只有最初版本的 30%
。
对于网络传输及捉襟见肘的磁盘空间而言真是个太好的消息了!