· 2分で読了

Golangプロジェクトで環境変数を設定する方法

この記事は中国語から自動翻訳されたものです。翻訳によりニュアンスが失われている場合があります。

はじめに

プロジェクトの開発時には異なる環境を切り替えることがよくあり、そのため僕たちは通常、様々な環境変数を設定する。しかし、コード内に値を直接ハードコードしてしまうと、変更のたびに修正するのが非常に面倒だ。動的な方法で環境変数を渡すことができれば、無駄なコード修正を大幅に減らすことができ、プログラムも比較的クリーンに保てる。

flag

Golangでは通常、flag パッケージを利用して同様の効果を得ることができる。例えば以下のような形だ:

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 を使ってコンパイル時に変数を設定することもできる。

確かにこれならプログラム内に値をハードコードする必要はないが、変数は事前に定義しておく必要がある。

YAMLからの読み込み

上述の問題を解決するために、YAML(あるいは好みのフォーマット)を使って環境変数を一元管理することができる。例えば以下のようにする:

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) で設定する。こうすればローカル環境でも簡単に変数を調整できるようになる。なお、設定ファイルは必ず .gitignore などで除外しておくことを忘れないようにしよう。そうしないと、変数の中に機密情報が含まれていて、たまたま公開リポジトリだった場合に丸見えになってしまう。

おわりに

僕はこの処理を行うためのごくシンプルな リポジトリ を作成した。もし実際の開発で本当に必要になったら、さらに改善していこうと思う XD

関連記事

他のトピックを探索