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に変数をロードします。

要するに環境変数を管理するためのパッケージってことか。このパッケージがあることで、開発環境と本番環境の切り替えが簡単にできる。
https://github.com/joho/godotenv
https://codelab.website/golang-godotenv/

ハガユウキハガユウキ

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

https://maku77.github.io/p/4ox6dmu/
https://codelab.website/golang-godotenv/
https://pkg.go.dev/github.com/joho/godotenv@v1.5.1

このスクラップは2023/06/21にクローズされました