diff --git a/go.mod b/go.mod index 9c473e7..dd3f454 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/mojocn/base64Captcha v1.3.5 github.com/pkg/errors v0.9.1 github.com/rogeecn/gen v1.0.11 - github.com/spf13/cobra v1.5.0 + github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 go.uber.org/dig v1.15.0 go.uber.org/zap v1.21.0 @@ -41,7 +41,7 @@ require ( github.com/golang/protobuf v1.5.2 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.13.0 // indirect github.com/jackc/pgio v1.0.0 // indirect diff --git a/go.sum b/go.sum index a770afc..9f2a0dd 100644 --- a/go.sum +++ b/go.sum @@ -206,8 +206,7 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -360,8 +359,7 @@ github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= diff --git a/providers/config/config.go b/providers/config/config.go index ca2246c..fe09343 100644 --- a/providers/config/config.go +++ b/providers/config/config.go @@ -5,14 +5,22 @@ import ( "github.com/spf13/viper" ) -func Load(file string) (*viper.Viper, error) { +func Load(file, app string) (*viper.Viper, error) { v := viper.NewWithOptions(viper.KeyDelimiter("_")) v.AutomaticEnv() - v.SetConfigFile(file) + + if file == "" { + v.SetConfigType("toml") + v.SetConfigName(app) + v.AddConfigPath("/etc") + v.AddConfigPath("/usr/local/etc") + } else { + v.SetConfigFile(file) + } + if err := v.ReadInConfig(); err != nil { return nil, err } - err := container.Container.Provide(func() (*viper.Viper, error) { return v, nil }) diff --git a/providers/database/redis/config.go b/providers/database/redis/config.go index 8e85a68..a1bc662 100644 --- a/providers/database/redis/config.go +++ b/providers/database/redis/config.go @@ -4,10 +4,21 @@ import ( "fmt" "github.com/go-redis/redis/v8" + "github.com/rogeecn/atom/container" + "github.com/rogeecn/atom/utils/opt" ) const DefaultPrefix = "Redis" +func DefaultProvider() container.ProviderContainer { + return container.ProviderContainer{ + Provider: Provide, + Options: []opt.Option{ + opt.Prefix(DefaultPrefix), + }, + } +} + type Config struct { Host string Port uint diff --git a/root.go b/root.go index 7a6fae7..f951169 100644 --- a/root.go +++ b/root.go @@ -1,6 +1,7 @@ package atom import ( + "fmt" "log" "github.com/pkg/errors" @@ -18,15 +19,21 @@ var ( GroupGrpcServer = dig.Group("grpc_server_services") ) -func Serve(providers container.Providers, opts ...Option) error { - var rootCmd = &cobra.Command{} - rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "config.toml", "config file path") +func init() { +} + +func Serve(providers container.Providers, opts ...Option) error { + var rootCmd = &cobra.Command{Use: "app"} for _, opt := range opts { opt(rootCmd) } - if err := LoadProviders(cfgFile, providers); err != nil { - return err + + defaultCfgFile := fmt.Sprintf(".%s.toml", rootCmd.Use) + rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file path, lookup in dir: $HOME, $PWD, /etc, /usr/local/etc, filename: "+defaultCfgFile) + + rootCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + return LoadProviders(cfgFile, cmd.Use, providers) } withMigrationCommand(rootCmd) @@ -36,9 +43,9 @@ func Serve(providers container.Providers, opts ...Option) error { return rootCmd.Execute() } -func LoadProviders(cfgFile string, providers container.Providers) error { +func LoadProviders(cfgFile, appName string, providers container.Providers) error { // parse config files - configure, err := config.Load(cfgFile) + configure, err := config.Load(cfgFile, appName) if err != nil { return errors.Wrapf(err, "load config file: %s", cfgFile) }