環境変数
環境変数で設定を上書きします
「環境変数」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
環境変数を使う理由
Twelve-Factor Appの方法論では、設定を環境に保存することを推奨しています。環境変数を使うと、ファイルを編集せずに、同じバイナリの動作を開発、ステージング、本番環境で変えられます。
Viperでは、ファイル設定に環境変数を重ねて適用できます。
優先順位
Viperは、優先度の高い順にソースを確認してキーを解決します。
- 明示的な
Setの呼び出し - フラグ
- 環境変数
- 設定ファイル
- デフォルト値
つまり、環境変数はファイルの値を上書きしますが、明示的なSetには負けます。
環境変数のサポートを有効にする
viper.AutomaticEnv()を呼び出すと、要求した任意のキーについて環境変数を確認するようViperに指示できます。これにより、viper.GetString("port")はPORT環境変数を確認します。
viper.AutomaticEnv()
port := viper.GetString("port")プレフィックスの追加
無関係な環境変数との衝突を避けるには、プレフィックスを設定します。
viper.SetEnvPrefix("myapp")- これでキー
portは環境変数MYAPP_PORTに対応します
Viperはキーを大文字に変換し、アンダースコアでプレフィックスを先頭に付けます。
viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetString("port")) // reads MYAPP_PORTネストしたキーの扱い
環境変数にはドットを含められません。キーリプレーサーを使ってドット区切りのキーをアンダースコアに変換すると、server.portはSERVER_PORTになります。
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
viper.AutomaticEnv()
// server.port -> SERVER_PORT単一の変数をバインドする
自動モードの代わりに、viper.BindEnvを使って1つのキーを明示的にバインドできます。環境変数名がプレフィックスの規則に従わない場合に便利です。
viper.BindEnv("id", "ACCOUNT_ID")
fmt.Println(viper.GetString("id"))標準ライブラリのosパッケージ
内部では、これはプロセスの環境から値を読み取ります。標準ライブラリではos.Getenvとos.LookupEnvを通じて利用できます。
os.Getenvは、設定されていない場合に空文字列を返しますos.LookupEnvは、環境変数が存在するかどうかを示す2番目のbool値を返します
val, ok := os.LookupEnv("PORT")
if !ok {
val = "8080" // default
}Goで環境変数を設定する
テストやデフォルト値の設定では、os.Setenvを使ってプログラムから環境変数を設定できます。次の例では、まさにこれを使って上書きの動作を示します。
os.Setenv("MYAPP_PORT", "9090")空文字列と未設定の違い
空文字列に設定された環境変数も、存在することに注意してください。os.LookupEnvは("", true)を返します。os.Getenvだけを使うと、空文字列と未設定を区別できません。これは、ブール値のようなフラグでは重要です。
os.Setenv("FEATURE", "")
v, ok := os.LookupEnv("FEATURE")
fmt.Println(v == "", ok) // true true組み合わせる(概念)
一般的な起動フローは、まずファイルを読み込んでデフォルト値を取得し、次にAutomaticEnvを呼び出してデプロイ環境の環境変数を優先するというものです。運用担当者はYAMLに触れずにMYAPP_PORTを変更できます。
viper.SetConfigName("config")
viper.ReadInConfig()
viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetInt("port"))実行可能な例:環境変数による上書き
この標準ライブラリだけを使ったプログラムは、ファイルのデフォルト値を環境変数で上書きするという、Viperの優先順位を再現します。
package main
import (
"fmt"
"os"
)
func get(key, fileDefault string) string {
if v, ok := os.LookupEnv(key); ok {
return v
}
return fileDefault
}
func main() {
os.Setenv("PORT", "9090")
fmt.Println("port:", get("PORT", "8080"))
fmt.Println("host:", get("HOST", "localhost"))
}クイックチェック
環境変数による設定について理解度を確認しましょう。
まとめ
環境変数で設定を上書きする方法を学びました。
- Viperの優先順位では、環境変数はファイルより上位に位置します
AutomaticEnvとSetEnvPrefixで、キーをPREFIX_KEYに対応付けます- ドット区切りのネストしたキーには
SetEnvKeyReplacerを使用します - 標準ライブラリでは
os.Getenv/os.LookupEnvがこの機能を支えています
よくある質問
「環境変数」レッスンは無料ですか?
はい。「環境変数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「環境変数」で何を学びますか?
環境変数で設定を上書きします ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「環境変数」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。