go-tooling-workshop 中關於go build的講解能夠了解到go bulid的一些用法,這篇文章最後要求實現一個根據go bulid -tag功能來編譯不一樣版本的作法,version參數根據tag傳進來的值進行編譯。下面是一個實例,main.gogit
package main import "fmt" // HINT: You might need to move this declaration to a different file. const version = "dev" func main() { fmt.Printf("running %s version", version) }
好,新建一個dev_config.go文件,代碼以下github
// +build dev package main var version = "DEV"
上面代碼的關鍵是 // +build dev
這行代碼,注意這行代碼先後須有一個空行隔開,例如在第一行時,接下來要空出一行。這個文件只會被go bulid識別到,而go run等命令不會去識別這個文件,並且vscode等編輯器也會略過這個文件。
再新建一個文件release_config.go,代碼以下編輯器
// +build release package main const version = "RELEASE"
代碼已經準備完畢,還有一個地方要注意,須要去掉main.go中的const version = 'dev'
這行代碼,不然,go bulid命令會報version重複定義。
執行命令以下:ui
lin@DESKTOP-HQI5HRL MINGW64 /g/workspace/GoWorkspace/src $ go build -tags dev -o dev_version lin@DESKTOP-HQI5HRL MINGW64 /g/workspace/GoWorkspace/src $ ./dev_version running DEV version lin@DESKTOP-HQI5HRL MINGW64 /g/workspace/GoWorkspace/src $ go build -tags release -o release_version lin@DESKTOP-HQI5HRL MINGW64 /g/workspace/GoWorkspace/src $ ./release_version running RELEASE version
go build還支持經過命令行傳遞編譯參數,經過-ldflags參數實現,將main.go修改成this
package main import "fmt" // HINT: You might need to move this declaration to a different file. var version string func main() { fmt.Printf("running %s version", version) }
命令行執行:spa
lin@DESKTOP-HQI5HRL MINGW64 /g/workspace/GoWorkspace/src $ go build -ldflags '-X main.version="dev"' -o dev_version lin@DESKTOP-HQI5HRL MINGW64 /g/workspace/GoWorkspace/src $ ./dev_version running "dev" version lin@DESKTOP-HQI5HRL MINGW64 /g/workspace/GoWorkspace/src