Go可以在編譯時期透過LDFLAGS來給程式中的變數賦值.
例如 編譯時給GIT版本訊息、給版號、給某種secretKey,
或者是正式環境的sql連線字串跟密碼, 透過這種方法填入.
這樣開發者跟運維也能在某種程度上, 隱密資訊是分開的.
不然開發者都知道正式環境的所有連線資訊, 資安不就本身出了點問題了嘛XD
運維只要最後佈署時, 知道有哪些路徑跟變數需要代入什麼值進去即可.
main.go
package main
import (
"fmt"
"github.com/tedmax100/vendorTest/otherpkg"
)
var (
// Git版號
VERSION string
// 編譯時間
BUILD_TIME string
)
func main() {
fmt.Printf("%s\n%s\n%s\n%s\n", VERSION, BUILD_TIME, GO_VERSION, otherpkg.SECRETKEY)
}
otherpkg/pkg.go
package otherpkg
var (
// 秘鑰
SECRETKEY string
)
編譯並輸出到檔案testldflags
go build -ldflags "-X main.VERSION=1.0.0 -X 'main.BUILD_TIME=`date`' -X 'main.GO_VERSION=`go version`' -X github.com/tedmax100/vendorTest/otherpkg.SECRETKEY=abcdefg" -o testldflags
# 執行testldflags檔案
./testldflags
# 1.0.0
# 五 10月 4 23:49:14 CST 2019
# go version go1.12.9 linux/amd64
# abcdefg
編譯時, 透過鍊結選項-X
來動態傳入資料並且設置
語法格式 -X importpath.name=value
因為我們是在專案根目錄下輸入這個, 所以main包的剛好不必輸入很長的路徑, 直接給包名跟變數名稱.
可是otherpkg就比較麻煩, LDFLAGS不吃相對路徑, 所以只好給他它的完整路徑.
這樣就不必在環境變數上特別設定, 或者是在conf檔上設定.
如果傳入的值是linux的指令(date, go version...)要用'' 把importpath.name=value包住, 然後value用 `` 把指令包住.
本來想結合go generate
但之後再分享在個人網誌上
https://link.medium.com/ZxvMZT48Ymb
A better way than “ldflags” to add a build version to your Go binaries