質問やフィードバックがありましたら、フォームからお願いします
本文は台湾華語で、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