go build -tags 的使用


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
完整例子


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM