go build
使用tag來實現編譯不同的文件
go-tooling-workshop 中關於go build的講解可以了解到go bulid的一些用法,這篇文章最后要求實現一個根據go bulid -tag功能來編譯不同版本的做法,version參數根據tag傳進來的值進行編譯。下面是一個實例,main.go
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文件,代碼如下
// +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重復定義。
執行命令如下:
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修改為
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)
}
命令行執行:
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