0

私は、別の質問で学んだviper パッケージを使用して、Go での構成管理を調査してきました。新しい構成を初期化する方法がわかりません。私がやりたいことは、システム構成が存在する場合はそれを見つけ、次にユーザー構成を見つけ、他のすべてが失敗した場合は、デフォルトから新しいユーザー構成を作成 (および使用) することです。次にアプリを実行すると、以前に作成した構成が見つかるはずです。私はこのように使用しています:

import (
    "fmt"
    "github.com/spf13/viper"
    "os"
    "os/user"
    "path/filepath"
)

usr, err := user.Current()
appMode := "test" // or "production" or...
configDir := filepath.Join(usr.HomeDir, ".myapp")
config := viper.New()

config.SetConfigName(appMode)
config.SetConfigType("json")

config.SetDefault("group1.key1", "value1.1")
config.SetDefault("group1.key2", 1234)
config.SetDefault("group2.key1", "value2.1")
config.SetDefault("group2.key2", 5678)

config.AddConfigPath("/usr/share/myapp/config")
config.AddConfigPath("/usr/local/share/myapp/config")
config.AddConfigPath(configDir)

if err := config.ReadInConfig(); err != nil {
    filename := filepath(configDir, fmt.Sprintf("%s.json", appMode))
    _, err := os.Create(filename)
    if err != nil {
        panic(fmt.Stringf("Failed to create %s", filename))
    }
}

if err := config.ReadInConfig(); err != nil {
    panic("Created %s, but Viper failed to read it: %s",
          filename, err)
}

この時点で、次のように ~/.myapp/test.json を作成したいと思います。

{
    "group1": {
        "key1": "value1.1",
        "key2": 1234
    },
    "group2": {
        "key1": "value2.1",
        "key2": 5678
    }
}

その結果、ファイルは空になり、ファイルが存在するにもかかわらず、「open : no such file or directory」というメッセージが表示され、2 回目の読み取り試行も失敗します。ファイルを手動で編集すると、Viper がファイルを見つけて解析します。もちろん、JSON ファイルをプログラムで作成することもできますが、これは非常に明白な使用例のように思われるため、ここで何かが欠けているはずです。

4

0 に答える 0