##############################

 

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

 

 

 

 具体操作

编译跨平台的只需要修改​​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

 

 

###########################