zoukankan      html  css  js  c++  java
  • go build 使用

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

    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
    ", Version)
            log.Printf("Branch: %s
    ", Branch)
            log.Printf("Commit: %s
    ", Commit)
            log.Printf("BuildTime: %s
    ", BuildTime)
            log.Printf("lowercase: %s
    ", 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

     具体操作

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

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

    igoodful@qq.com
  • 相关阅读:
    NOIP 2012 T5 借教室 [洛谷P1083]
    POJ2437 Muddy roads
    POJ2288 Islands and Bridges
    洛谷P2014 TYVJ1051 选课
    POJ1741 Tree
    CODEVS1995 || TYVJ1863 黑魔法师之门
    TYVJ1939 玉蟾宫
    TYVJ1305 最大子序和
    POJ1737 Connected Graph
    TYVJ1864 守卫者的挑战
  • 原文地址:https://www.cnblogs.com/igoodful/p/15005819.html
Copyright © 2011-2022 走看看