##############################
go build --ldflags “-s -w ” -o myexe main.go
-X importpath.name=value 编译期设置变量的值 -s disable symbol table 禁用符号表 -w disable DWARF generation 禁用调试信息
很多命令行程序都可以通过version参数输出版本信息,commit,操作系统等信息。下面介绍一种方法实现golang编译的命令行程序打印版本号。 docker打印的版本信息: $ ~ docker version Client: Docker Engine - Community Version: 18.09.2 API version: 1.39 Go version: go1.10.8 Git commit: 6247962 Built: Sun Feb 10 04:12:39 2019 OS/Arch: darwin/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.2 API version: 1.39 (minimum version 1.12) Go version: go1.10.6 Git commit: 6247962 Built: Sun Feb 10 04:13:06 2019 OS/Arch: linux/amd64 Experimental: false 实现方式是利用go build的一个参数-ldflags。输入go help build,可以看到一个配置项: -ldflags ‘flag list‘ arguments to pass on each go tool link invocation. 这个参数是用来设置go link(静态链接)的一些参数,具体有哪些参数可以通过go tool link --help查看。 其中-X参数可以在编译时给包内的变量赋值,然后我们利用flag包设置version参数就能实现打印版本号了。 main.go: package main import ( "flag" "log" "os" ) var ( Version string Branch string Commit string BuildTime string lowercase string // 小写也可以 ) func main() { versionFlag := flag.Bool("version", false, "print the version") flag.Parse() if *versionFlag { log.Printf("Version: %s\n", Version) log.Printf("Branch: %s\n", Branch) log.Printf("Commit: %s\n", Commit) log.Printf("BuildTime: %s\n", BuildTime) log.Printf("lowercase: %s\n", lowercase) os.Exit(0) } log.Println("run main.go") } 打包脚本: #!/usr/bin/env bash prog=xxx version=1.1.0 lowercase=ok # 交叉编译 # CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-X main.Version=$version -X main.Branch=`git rev-parse --abbrev-ref HEAD` \ -X main.Commit=`git rev-parse HEAD` -X main.BuildTime=`date -u ‘+%Y-%m-%d_%H:%M:%S‘` -X main.lowercase=$lowercase " -v -o $prog main.go 最终效果: $ ./xxx -version 2019/04/11 00:59:08 Version: 1.1.0 2019/04/11 00:59:08 Branch: master 2019/04/11 00:59:08 Commit: 29921d9df18543693321e2109ea36462dbb346d3 2019/04/11 00:59:08 BuildTime: 2019-04-10_16:59:07 2019/04/11 00:59:08 lowercase: ok
具体操作
编译跨平台的只需要修改
GOOS
、GOARCH
、CGO_ENABLED
三个环境变量即可
- GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
- GOARCH:目标平台的体系架构32位还是64位(386、amd64、arm)
- 交叉编译不支持 CGO 所以要禁用它
Window环境下编译 Mac 和 Linux 64位可执行程序
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go
Mac 下编译 Linux 和 Windows 64位可执行程序
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go 复制
Linux 下编译 Mac 和 Windows 64位可执行程序
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
###########################