關於 golang build

如何編譯

golang 的編譯仍是比較容易的,用法以下:html

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

上面方括號標記的參數,均可以沒有……git

最簡的操做就是直接 go build ,這樣操做會直接找到當前文件夾下的 main 包,並編譯之。golang

比較經常使用的就是 -o 了,指定輸出文件,好比:windows

go build -o 666 main.go

此時會將 main.go 編譯爲二進制文件666(windows下會輸出成 666.exebash

go 是支持交叉編譯的,請參見 golang開發環境配置備忘ui

更多設置

具體操做能夠參考命令說明,在你的命令行輸入 go help build 查看細節。命令行

我在這列舉若干調試

縮小輸出文件體積

go 編譯出的文件,實話說體積挺大的。一個重要緣由是其中包含了調試信息,咱們能夠經過編譯參數使其不包含調試信息,這樣輸出的體積會小一些。code

# 移除 調試信息(-w) 和 符號表(-s)
go build -o main -ldflags "-w -s" main.go

上述操做使用 -ldflags 參數指定 -w-s, 分別表示在編譯時不包含調試信息和符號表,此舉能夠較好地縮減二進制文件體積。htm

編譯時寫入全局變量

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

相關文章
相關標籤/搜索