質問やフィードバックがありましたら、フォームからお願いします
本文は台湾華語で、ChatGPT で翻訳している記事なので、不確かな部分や間違いがあるかもしれません。ご了承ください
数ヶ月前、私は golang で環境変数を設定する方法についての記事を書きました。環境変数を優雅に設定することは非常に重要なことですので、この目的のためにシンプルな関数を作成しました。
当初の考えはシンプルでした。対応する config
ファイルがある場合、その中の key/value を os.Setenv
を使って設定するというものでした。その後、アプリ全体で os.Getenv
を使って値を取得できるようになります。
しかし、正式にデプロイを行うと、いくつかの問題が見えてきます:
- 設定ファイルは必ずしも yaml ではなく、他の形式である可能性もあります。
- 時には外部サービス(consul, etcd など)を通じて環境変数を注入したい場合がありますが、現状の書き方では
os.Getenv
を使用しています。 - 異なるパスから設定ファイルを読み込むことができます。
- コマンドラインを通じて変数を設定することができます。
- その他、予想外の問題が発生することがあります。
小さなプロジェクトではこれで問題が解決しましたが、より柔軟な設定方法が必要になると、これだけでは不十分です。
実は、これらの問題に対して golang には成熟した解決策があり、それが Viper です。
VIPER
Viper は非常に強力な環境変数設定ライブラリです。以下の機能をサポートしています:
- デフォルト値
- 様々な形式の設定ファイルをサポート(
json
,toml
,yaml
) - 設定ファイルの変更を監視することができます(これでサーバーを再起動する必要がありません!)
- リモートサーバーから変数を取得することができます(例えば
consul
やetcd
) flag
を使って変数を取得することができますreader
から変数を取得することができ、異なるソースから変数を設定できます。
基本使用
まず、go get または mod を使って Viper をダウンロードします。
go get github.com/spf13/viper
func main() {
viper.SetDefault("AWS_ACCESS_TOKEN", "AWS123456789") // デフォルト値を設定
viper.SetConfigName("config") // config のファイル名を指定
viper.AddConfigPath("./config")
viper.ReadInConfig()
viper.AutomaticEnv()
}
SetDefault(key, value)
:デフォルト値を設定SetConfigName(name)
: config のファイル名を設定します。例えば、私たちの設定ファイルがconfig.yml
であれば、名前はconfig
です。なぜ type を指定しないのかと言うと、viper が自動的に処理してくれるからです。AddConfigPath
:複数のフォルダを設定できます。ReadInConfig
:実際に設定を読み込むために呼び出す必要があります。AutomaticEnv
:ENV
の変数を自動的に viper に同期させることができます。
Viper には設定を簡単に行うための多くの関数が用意されています。
変数の取得
変数を設定した後は、viper.Get
を使って読み取ることができます。Get
は interface{}
を返しますが、viper には viper.GetString
、viper.GetDuration
、viper.GetStringMap
など、さまざまな型変換の関数も提供されています。
func main() {
fmt.Println(viper.GetString("AWS_ACCESS_TOKEN"))
fmt.Println(viper.GetUint32("YOUR_INT"))
fmt.Println(viper.GetTime("YOUR_TIME"))
}
まとめ
変数設定は簡単とも言えず、難しいとも言えません。考慮すべきことは想像以上に多く、VIPER
が多くの一般的な使用シナリオを処理してくれます。
特に注意したいのは、access token や secret key などを設定する際には、必ず .gitignore
に追加して、意図せず GitHub にプッシュしてしまうことを避けるようにしてください。
この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨
☕Buy me a coffee