親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

godotenvによる.envファイルの読み込み有無で、開発環境と本番環境を切り分け

開発環境と本番環境を切り分けたい理由

アプリケーションの起動に当たって、開発環境と本番環境で設定を変えたいことがあるでしょう。
例えばサーバのポート番号やDB接続の定義情報など。
サードバーティのAPIに繋ぐ際に開発モードと本番モードが分かれている場合などもそうですね。
言語によってはymlで環境ごとに設定値を変える方法が多いですね。

GoのGinではどのように切り分ける?

やり方は色々ありますが、1つの方法として.envファイルの読み込み有無で判定する方法があります。
PythonのDjangoなどでも使う方法ですが、ローカルで用意した.envファイルをGitの管理対象から外し、.envの中身を読み込める場合はローカル環境の設定を、読み込めない場合は本番環境の設定をする方法です。

実装の中身

上記の設定を実装するためにはgodotenvを使用するのが良いです。

.envファイルを用意

プロジェクト直下にでも.envを用意してください。
中身は空でも構いません。(DBの接続情報を記載する場合もありますが、とりあえず空で用意しましょう。)
注意点として、上記にも記した通りGitの管理対象から外してください。
つまりは.gitignoreに含めてください。
.gitignore

.env

godotenvのインストール

go get github.com/joho/godotenv

import内にモジュールを定義

fmtもosも読み込み時に使用します。

import (
    "fmt"
    "os"
    "github.com/joho/godotenv"
)

読み込み処理の実装

例として、サーバのポート番号を設定する処理を書きました。
ローカル(開発)環境ではポートが9000、本番環境では80で起動させるための処理です。

func main() {
    port := "9000" // ローカル環境のポート番号を予め定義
    err := godotenv.Load(fmt.Sprintf("../%s.env", os.Getenv("GO_ENV")))
    if err != nil {
        // エラーの場合 = .envが読み込めない場合
        port = 80 // 本番環境のポート番号
    }
}

これでポート番号は80になりますね。
DBの接続情報やAPIの接続情報なども同様の方法で設定が可能です。
他にもやり方はあると思いますが、1つの方法としてご参考までに。