設定ファイルと環境変数から値を取得してstructにセットします。
- 設定なしでもつかえる
- 設定ファイルの位置、名前は自由
- 設定をsliceに格納することができる
- structが階層化されていても大丈夫
go get https://github.com/yakumo-saki/go-envconfig
(オプション)設定ファイルを作成する
STR_CONF=value_from_config_file
INT_CONF=1234
(オプション)環境変数をセットする
STR_CONF=value_from_env
package main
type Conf struct {
StrConf string
IntConf int
}
func main() {
envconfig.AddPath("path/to/your/config")
envconfig.AddPath("path/to/your/another/config") // if not found, thats ok. simply ignored
cfg := Conf{}
err := envconfig.LoadConfig(&cfg)
if err != nil {
panic(err)
}
fmt.Println(cfg.StrConf) // "value_from_config_file" or "value_from_env"
fmt.Println(cfg.IntConf) // 1234
}
- envconfig.AddPath() で追加された順番に設定ファイルを読み込みます。
- なお、指定された設定ファイルが存在しない場合は無視します
- envconfig.AddPath()されたファイルを読み終わった後に環境変数を読み込みます。
- 同一の設定が存在する場合、後に出現したものが優先されます。
細かい動作を指定したい場合は、受け側のstructにtagを記述することで制御可能。 通常の変数、slice、mapの3パターンで動作が変わる。 以下、環境変数もしくは、設定ファイルを合わせて設定と呼ぶ。
type Conf struct {
StrConf string `cfg:"ENV_OR_CFGKEY_NAME,option"`
IntConf int
}
設定のキー。指定された名前の設定の値がセットされる。
なし。指定するとエラーになる。
設定のキーのプレフィックス。
例えば、 MY_CFG
を指定すると、MY_CFG_0
MY_CFG_1
... MY_CFG_99
の値がsliceにセットされる。
環境変数と設定ファイルにプレフィックスに該当する設定があった場合、内容をマージする。
環境変数
MY_CFG_0=env_0
ファイル CFG_FILE
MY_CFG_0=file_0
結果
MY_CFG=["env_0", "file_0"]
環境変数と設定ファイルにプレフィックスに該当する設定があった場合、最後に見つけた内容のみをsliceにセットする。
ファイル CFG_FILE
MY_CFG_0=file_0
環境変数
MY_CFG_0=env_0
結果
MY_CFG=["env_0", "file_0"]
envconfig.LoadConfigに渡すstructに値をセットしてから渡すことで設定可能。
func main() {
cfg := Conf{}
cfg.StrConf = "default value"
err := envconfig.LoadConfig(&cfg)
fmt.Println(cfg.StrConf) // "default value"
}
デフォルトでは、フィールド名をUPPER_SNAKE_CASEにしたものが設定のキーとして使用されます。
以下の例であれば、STR_CONF
が使用されます。これを変更したい場合は以下のように指定します。
type Conf struct {
StrConf string `cfg:"MY_CONFIG"`
}
cfgタグの二番目のオプションに slice
を追加することで可能です。
type Conf struct {
SliceConfig []string `cfg:"SLICE_CONFIG,slice"`
}
SLICE_CONFIG0
,SLICE_CONFIG00
,
SLICE_CONFIG1
,SLICE_CONFIG01
,
...SLICE_CONFIG99
までを探してSliceにして読み込む。連番でなくてもOK。
この設定の場合は、複数のファイルに SLICE_CONFIGnn
が一つでもある場合上書きされる。
note: 上記の例の場合、SLICE_CONFIG
というキーは読み込まれないことに注意
SLICE_CONFIG00=abc
SLICE_CONFIG00=xyz
→ SLICE_CONFIG = []string{"xyz"}
"abc" は上書きされる。
cfgタグの二番目のオプションに mergeslice
を追加することで可能です。
type Conf struct {
SliceConfig []string `cfg:"SLICE_CONFIG,mergeslice"`
}
SLICE_CONFIG00=abc
SLICE_CONFIG00=xyz
→ SLICE_CONFIG = []string{"abc", "xyz"}
TEST=this is not read
type SimpleConfig struct {
Test string
}
func main() {
cfg := SimpleConfig{}
// Use Strict mode.
UseStrict()
envconfig.LoadConfig(&cfg)
fmt.Println(cfg.Test) // empty. NOT "this is not read"
}
SLICE_0=abc
SLICE_1=def
# これで上書きしても、[]string = {""} となり空にはなりません。
SLICE_0=