Go 語言交叉編譯和構(gòu)建標(biāo)簽
現(xiàn)代應(yīng)用支持多平臺(tái)運(yùn)行是一件稀松平常的事情衔峰,在 Go 語言里面,為了支持應(yīng)用的多平臺(tái)部署,給用戶提供了方便的配置方式來輕松構(gòu)建針對不同操作系統(tǒng)和平臺(tái)的運(yùn)行文件仍律。
Go 構(gòu)建標(biāo)簽
Go 的構(gòu)建約束,即構(gòu)建標(biāo)簽实柠,是以// go:build
為開始的行注釋水泉,如果是 1.16 或之前的版本,格式是// +build
窒盐。跟此變更相關(guān)的 issue 可以參考25348草则。
構(gòu)建標(biāo)簽必須出現(xiàn)在 package 子句之前。為了區(qū)分構(gòu)建標(biāo)簽和包文檔的描述注釋蟹漓,構(gòu)建標(biāo)簽后面應(yīng)該有一個(gè)空行炕横。
構(gòu)建標(biāo)簽由||, &&, !運(yùn)算符以及括號來組合表達(dá)。運(yùn)算符與 Go 中的含義相同葡粒。
例如份殿,以下構(gòu)建標(biāo)簽在滿足linux
和386
約束膜钓,或者滿足darwin
而cgo
不滿足時(shí)構(gòu)建文件:
//go:build (linux && 386) || (darwin && !cgo)
又如:僅在使用 cgo 時(shí),且僅在 Linux 和 OS X 上構(gòu)建文件://go:build cgo && (linux || darwin)
注意:1.17 及以后的表達(dá)格式里卿嘲,一個(gè)文件有多個(gè) //go:build
行是錯(cuò)誤的颂斜。
在 1.16 及以前的版本,多行構(gòu)建標(biāo)簽是允許的拾枣,并且組合方式是通過空格和逗號等來區(qū)分沃疮,空格符表示 OR,逗號表示 AND,感嘆號表示 NOT梅肤。而多行之間則表示 OR司蔬。gofmt 命令將在遇到舊語法時(shí)添加等效的 //go:build
約束。如下是示例:
標(biāo)簽 | 約束含義 |
---|---|
// +build linux,386 darwin,!cgo | (linux AND 386) OR (darwin AND (NOT cgo)) |
// +build linux darwin // +build amd64 |
(linux OR darwin) AND amd64 |
如果文件名在去除擴(kuò)展名和可能的_test
后綴后匹配以下任何模式, (例如:source_windows_amd64.go)其中 GOOS 和 GOARCH 分別代表任何已知的操作系統(tǒng)和體系結(jié)構(gòu)值姨蝴,那么認(rèn)為該文件除了文件中的任何顯式約束之外俊啼,具有這些術(shù)語的所表達(dá)的隱式構(gòu)建標(biāo)簽。
_GOOS
_GOARCH
_GOOS_GOARCH
除了官方提供的針對不同平臺(tái)的內(nèi)置標(biāo)簽似扔,用戶也可以使用自定義標(biāo)簽吨些,例如//go:build prod
, 只需要在執(zhí)行go build
時(shí)顯式帶上標(biāo)簽名go build --tags=prod
搓谆。
想要使文件構(gòu)建時(shí)被忽略炒辉,可以使用://go:build ignore
,其他任何沒有被用來定義為標(biāo)簽的詞也可以泉手,但"ignore"是約定俗成的黔寇。)。Go 語言目前支持的系統(tǒng)和架構(gòu)可以參考官方文檔斩萌。