關於 Golang Buil

如何編譯

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://www.debug8.com/golang/t_46691.html