私は、別の質問で学んだ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 ファイルをプログラムで作成することもできますが、これは非常に明白な使用例のように思われるため、ここで何かが欠けているはずです。