Closed3
godotenvの使い方をざっくりまとめる
[到達したい状態]
- godotenvとは何か人に説明できる
- godotenvを実際に使いこなせる
[やること]
- godotenvのドキュメントを読む
godotenvとは
A Go (golang) port of the Ruby dotenv project (which loads env vars from a .env file). From the original Library: Ruby dotenv プロジェクト(.env ファイルから env vars をロードする)の Go (golang) ポートです。
環境変数に設定を保存することは、12ファクターアプリの基本的な考え方の1つです。データベースのリソースハンドルや外部サービスの認証情報など、デプロイ環境間で変更される可能性があるものは、コードから環境変数に抽出する必要があります。
しかし、複数のプロジェクトが稼働する開発マシンや継続的インテグレーションサーバーに環境変数を設定するのは、必ずしも現実的ではありません。Dotenvは、環境起動時に.envファイルからENVに変数をロードします。
要するに環境変数を管理するためのパッケージってことか。このパッケージがあることで、開発環境と本番環境の切り替えが簡単にできる。
godotenvの使い方
プロジェクトの構成
➜ go-sandbox tree
.
├── cmd
│ ├── foo.txt
│ └── main.go
├── env
│ ├── dev.env
│ └── prod.env
├── go.mod
└── go.sum
コード例
環境変数を利用するためには、まずはLoad関数を呼び出します。Loadはenvファイルを読み込み、このプロセスのためにENVにロードします。この関数は、できるだけプログラムの開始位置(理想的にはmainの中)で呼び出します。引数なしでLoadを呼び出した場合、デフォルトで現在のパスの.envを読み込むことになります。その後、os.Getenvで特定の環境変数を参照します。os.Getenvは、指定した名前の環境変数が設定されていない場合は、空文字列 ("") を返します。
package main
import (
"errors"
"fmt"
"os"
"time"
"github.com/joho/godotenv"
"go.uber.org/zap"
)
var ErrFoo = fmt.Errorf("foo")
var ErrBar = errors.New("bar")
func main() {
err := doSomething()
if err != nil {
logger := GetLogger()
logger.Info("Hello zap", zap.String("key", "value"), zap.Time("now", time.Now()))
logger.Warn("Hello zap", zap.String("key", "value"), zap.Time("now", time.Now()))
err := godotenv.Load(fmt.Sprintf("../env/%s.env", os.Getenv("GO_ENV")))
if err != nil {
logger := GetLogger()
logger.Info("Hello zap", zap.Error(err), zap.Time("logged_at", time.Now()))
}
p := os.Getenv("DB_PORT")
fmt.Println(p)
}
}
func doSomething() error {
return ErrFoo
}
// 開発環境と本番環境で分ける
// dev用はconsole形式で出力
// prd用はjson形式で出力
func GetLogger() *zap.Logger {
var logger *zap.Logger
if os.Getenv("GO_ENV") == "prod" {
logger, _ = zap.NewProduction()
} else {
logger, _ = zap.NewDevelopment()
}
return logger
}
出力結果
➜ go-sandbox cd cmd
➜ cmd GO_ENV=prod go run .
{"level":"info","ts":1687315807.599319,"caller":"cmd/main.go:21","msg":"Hello zap","key":"value","now":1687315807.5993118}
{"level":"warn","ts":1687315807.599411,"caller":"cmd/main.go:22","msg":"Hello zap","key":"value","now":1687315807.599411}
3300
➜ cmd GO_ENV=dev go run .
2023-06-21T11:50:13.824+0900 INFO cmd/main.go:21 Hello zap {"key": "value", "now": "2023-06-21T11:50:13.824+0900"}
2023-06-21T11:50:13.825+0900 WARN cmd/main.go:22 Hello zap {"key": "value", "now": "2023-06-21T11:50:13.825+0900"}
main.main
/Users/yuuki_haga/repos/go/go-sandbox/cmd/main.go:22
runtime.main
/usr/local/go/src/runtime/proc.go:250
3306
このスクラップは2023/06/21にクローズされました