yakumo-saki / go-envconfig

Go config reader for envfile and environment value

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

MaintainabilityTest Coverage

go-envconfig

設定ファイルと環境変数から値を取得してstructにセットします。

特徴

  • 設定なしでもつかえる
  • 設定ファイルの位置、名前は自由
  • 設定をsliceに格納することができる
  • structが階層化されていても大丈夫

インストール

go get https://github.com/yakumo-saki/go-envconfig

Getting started

(オプション)設定ファイルを作成する

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()されたファイルを読み終わった後に環境変数を読み込みます。
  • 同一の設定が存在する場合、後に出現したものが優先されます。

TAG

細かい動作を指定したい場合は、受け側のstructにtagを記述することで制御可能。 通常の変数、slice、mapの3パターンで動作が変わる。 以下、環境変数もしくは、設定ファイルを合わせて設定と呼ぶ。

type Conf struct {
    StrConf string `cfg:"ENV_OR_CFGKEY_NAME,option"`
    IntConf int
}

通常の変数時

ENV_OR_CFGKEY_NAME

設定のキー。指定された名前の設定の値がセットされる。

option

なし。指定するとエラーになる。

Slice時

ENV_OR_CFGKEY_NAME

設定のキーのプレフィックス。 例えば、 MY_CFG を指定すると、MY_CFG_0 MY_CFG_1 ... MY_CFG_99 の値がsliceにセットされる。

merge (default)

環境変数と設定ファイルにプレフィックスに該当する設定があった場合、内容をマージする。

環境変数 
MY_CFG_0=env_0

ファイル CFG_FILE
MY_CFG_0=file_0

結果
MY_CFG=["env_0", "file_0"]
overwrite

環境変数と設定ファイルにプレフィックスに該当する設定があった場合、最後に見つけた内容のみをsliceにセットする。

ファイル CFG_FILE
MY_CFG_0=file_0

環境変数 
MY_CFG_0=env_0

結果
MY_CFG=["env_0", "file_0"]
map

Examples

デフォルト値を入れたい

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"`
}

連番で入力した設定をSliceで欲しい

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の例

SLICE_CONFIG00=abc
SLICE_CONFIG00=xyz

→ SLICE_CONFIG = []string{"xyz"}
"abc" は上書きされる。

複数ファイルにあるsliceを上書きではなくマージしたい

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を空にすることはできません

SLICE_0=abc
SLICE_1=def
# これで上書きしても、[]string = {""} となり空にはなりません。
SLICE_0=

About

Go config reader for envfile and environment value

License:Apache License 2.0


Languages

Language:Go 97.4%Language:Shell 2.6%