· 2 分鐘閱讀
如何為你的 Golang 專案設定環境變數
前言
在開發專案的時候常常需要切換不同的環境,也因此我們通常會設定不同的環境變數。不過如果直接寫死在程式當中每次修改起來實在太麻煩了,如果可以透過動態的方式傳入環境變數的話可以減少很多不必要的修改,程式也相對比較乾淨。
flag
一般在 golang 可以利用 flag 這個 package 做到類似的效果,例如:
var env string
var accessToken string
func main() {
flag.StringVar(&env, 'ENV', 'development', 'your current env')
flag.StringVar(&accessToken, 'ACCESS_TOKEN', 'xxx-oo-ooo', 'your API access token')
flag.Parse()
// start your application
}
或者也可以參考這篇文章中提到的方式,用 go build -ldflag 在 compile time 設定變數。
雖然這樣的確不用寫死值在程式裡頭,但變數仍然要事先定義好。
透過 YAML 載入
為了解決上述問題,我們可以透過 yaml(或者你喜歡的 format)來統一管理環境變數。例如:
func LoadEnv(filename string) bool {
file, err := ioutil.ReadFile(filename)
if err != nil {
// 在 production,我們可能會直接用 console 設定環境變數
return false
}
var config := make(map[string]string)
yaml.Unmarshal(file, &config)
for k, v := range config {
os.Setenv(k, v)
}
}
將 yaml 裡的變數載入後,在統一用 os.Setenv(k, v) 存入,這樣一來在 local 的環境下就可以很容易地調整變數,記得要把設定當給 ignore 掉,不然如果變數裡頭有敏感資料,又剛好是 public 的 repo 就會被看光光了。
後記
我寫了一個相當簡單的 repo 來做這件事,如果在開發上真的有需要的話再持續優化他吧 XD
相關文章
- 當測量變成目標:從窗戶稅到 Pull Request 數 我曾寫小工具統計自己一季貢獻了多少 PR、留了多少 review、解了多少 ticket,想拿數字向主管證明產出。主管只淡淡說績效不只看產出。幾年後我才懂——當測量變成目標,它就不再是一個好的測量了。從英國窗戶稅、河內滅鼠賞金,到今天用 PR 數評估開發者,機制一模一樣。
- 用 Cloudflare Images 當作圖片儲存、轉檔方案 在網頁放一張圖片是前端最簡單的事,但要把它做完整,包含縮放、生出各種格式、還要擋住流量,其實是一整個解決方案。我後來一律交給 Cloudflare Images,只留一份原圖給它。
- 別再用 AWS Access Key 了 Access Key 是 AWS 上容易被忽略的安全風險。用 OIDC 搭配 IAM Role,讓 GitHub Actions 不需要任何 secret 就能安全操作 AWS 資源
- 資料庫主鍵:AUTO_INCREMENT、UUID 與 UUIDv7 後端開發常需要決定主鍵,要用 auto increment 還是 UUID?碰撞怎麼辦?UUIDv7 跟 created_at + index 的效能差多少?實際跑了 2000 萬筆資料與設計決策告訴你