欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于 golang build

程序员文章站 2022-05-22 22:09:46
如何编译 golang 的编译还是比较容易的,用法如下: 上面方括号标记的参数,都可以没有…… 最简的操作就是直接 ,这样操作会直接找到当前文件夹下的 包,并编译之。 比较常用的就是 了,指定输出文件,比如: 此时会将 编译为二进制文件666(windows下会输出成 ) go 是支持交叉编译的,请 ......

如何编译

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\n", 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\n", buildtime)
    fmt.printf("git hash: %s\n", 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