go build -tags 的使用

go build

使用tag來實現編譯不一樣的文件

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
完整例子
相關文章
相關標籤/搜索