• 关于 golang build


    如何编译

    golang 的编译还是比较容易的,用法如下:

    go build [-o output] [-i] [build flags] [packages]
    

    上面方括号标记的参数,都可以没有……

    最简的操作就是直接 go build ,这样操作会直接找到当前文件夹下的 main 包,并编译之。

    比较常用的就是 -o 了,指定输出文件,比如:

    go build -o 666 main.go
    

    此时会将 main.go 编译为二进制文件666(windows下会输出成 666.exe

    go 是支持交叉编译的,请参见 golang开发环境配置备忘

    更多设置

    具体操作可以参考命令说明,在你的命令行输入 go help build 查看细节。

    我在这列举若干

    缩小输出文件体积

    go 编译出的文件,实话说体积挺大的。一个重要原因是其中包含了调试信息,我们可以通过编译参数使其不包含调试信息,这样输出的体积会小一些。

    # 移除 调试信息(-w) 和 符号表(-s)
    go build -o main -ldflags "-w -s" main.go
    

    上述操作使用 -ldflags 参数指定 -w-s, 分别表示在编译时不包含调试信息和符号表,此举可以较好地缩减二进制文件体积。

    编译时写入全局变量

    go 可以通过编译参数,在编译时对变量进行赋值。一般情况下,这种操作可以让程序保留编译信息等数据。
    通过 -ldflags 参数,设定 -X 操作,可以为全局变量赋值。
    试举一例:
    源码如下

    package main
    import "fmt"
    var BuildTime = "now"
    func main() {
    	fmt.Printf("BuildTime: %s
    ", BuildTime)
    }
    

    定义全局变量BuildTime并在主程序中输出。

    $ go run main.go 
    BuildTime: now
    
    $ go build -ldflags "-X 'main.BuildTime=time006'" main.go
    $ ./main 
    BuildTime: time006
    
    $ go build -ldflags "-X 'main.BuildTime=`date`'" main.go
    $ ./main 
    BuildTime: Sun 29 Sep 2019 10:14:47 PM CST
    

    上面分别演示了,直接运行源码,编译加参数运行的效果。第三个示例表示,使用 -X 对全局变量进行编译时赋值,甚至可以将命令结果赋予全局变量。

    所以通常我们会这么做:

    package main
    
    import "fmt"
    
    var BuildTime = ""
    var GitHash = ""
    
    func main() {
    	fmt.Printf("BuildTime: %s
    ", BuildTime)
    	fmt.Printf("Git Hash: %s
    ", GitHash)
    }
    

    分别定义 BuildTime 编译时间和 GitHash git的commit hash。在合适的时候输出,以方便地区分版本。并使用如下编译命令:

    go build -ldflags "-X 'main.BuildTime=`date`' -X 'main.GitHash=`git rev-parse HEAD`'" main.go
    

    最后,编译后的程序会有类似如下输出:

    $ ./main 
    BuildTime: Sun 29 Sep 2019 10:29:36 PM CST
    Git Hash: 9a80ee05b16e0aa90e6e0b690c7da8686fd102a0
    

    这样就能知道编译后的二进制文件版本是什么了。

    其它

    其它内容,想到再补充。


    原文发布于:https://moonlightwatch.me/%E5%BC%80%E5%8F%91%E9%9A%8F%E7%AC%94/27.html

  • 相关阅读:
    Ext.create() 时的自适应高度和宽度
    C++ builder快捷键大全
    删除右键菜单中的选项
    函数中指针和引用的形参和实参
    一道关于继承和多态的题目
    关于静态对象构造
    关于多态代码和运行结果
    如何使用C++ Builder 6.0连接Access数据库
    BCB中的RTTI机制
    scanf()返回值(转)
  • 原文地址:https://www.cnblogs.com/chr-wonder/p/11962476.html
Copyright © 2020-2023  润新知