iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
1
Software Development

下班加減學點Golang與Docker系列 第 28

Go 鍊結參數 LDFLAGS

  • 分享至 

  • twitterImage
  •  

LDFLAGS

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
但之後再分享在個人網誌上


上一篇
Gin With Swagger, 懶人API Doc生成神器
下一篇
Go 交叉編譯 與 Docker <3
系列文
下班加減學點Golang與Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
雷N
iT邦研究生 1 級 ‧ 2022-01-21 08:59:05

https://link.medium.com/ZxvMZT48Ymb

A better way than “ldflags” to add a build version to your Go binaries

我要留言

立即登入留言