spf13 / viper

Go configuration with fangs
MIT License
26.74k stars 2.02k forks source link

while there has space char in Annotation, viper would not set the value and also no error return #1562

Open sky5454 opened 1 year ago

sky5454 commented 1 year ago

Preflight Checklist

Viper Version

1.16

Go Version

1.20.4

Config Source

Files

Format

YAML

Repl.it link

No response

Code reproducing the issue

// RootDir would not be set the value
// in Annotation, space char after mapstructure 
// bad
type Log struct {
    Level      string `mapstructure:"level"  json:"level" yaml:"level"`
    RootDir    string `mapstructure: "root_dir" json:"root_dir" yaml:"root_dir"`
}

// good
// in Annotation, no space char after mapstructure 
type Log struct {
    Level      string `mapstructure:"level"  json:"level" yaml:"level"`
    RootDir    string `mapstructure:"root_dir" json:"root_dir" yaml:"root_dir"`
}

by this way to load the yaml and set the value

// Init Config
package boostrap

import (
    "fmt"
    "gin-oam-cni/global"
    "os"

    "github.com/fsnotify/fsnotify"
    "github.com/spf13/viper"
)

// My Init func
func InitConfig() *viper.Viper {
    configFile := "config.yaml"
    if configEnv := os.Getenv("VIPER_CONFIG"); configEnv != "" {
        configFile = configEnv
    }

    // init viper
    v := viper.New()
    v.SetConfigFile(configFile)
    v.SetConfigType("yaml")
    v.AddConfigPath(".")
    if err := v.ReadInConfig(); err != nil {
        panic(fmt.Errorf("read config failed: %w", err))
    }

    // dym load config
    v.WatchConfig()
    v.OnConfigChange(func(in fsnotify.Event) {
        fmt.Println("config file changed:", in.Name)
        if err := v.Unmarshal(&global.App.Config); err != nil {
            fmt.Println(err)
        }
    })

    // unmarshal, it also has no error while no set the value !!! bug
    if err := v.Unmarshal(&global.App.Config); err != nil {
        fmt.Println(err)
    }

    return v
}

Expected Behavior

two code, RootDir value must be set both.

Actual Behavior

RootDir value must be set.

but only: IN GOOD CODE: Level, RootDir has set. IN BAD CODE: Level has set.

two code has diff in Annotation, space char after mapstructure or not.

Steps To Reproduce

No response

Additional Information

No response

github-actions[bot] commented 1 year ago

👋 Thanks for reporting!

A maintainer will take a look at your issue shortly. 👀

In the meantime: We are working on Viper v2 and we would love to hear your thoughts about what you like or don't like about Viper, so we can improve or fix those issues.

⏰ If you have a couple minutes, please take some time and share your thoughts: https://forms.gle/R6faU74qPRPAzchZ9

📣 If you've already given us your feedback, you can still help by spreading the news, either by sharing the above link or telling people about this on Twitter:

https://twitter.com/sagikazarmark/status/1306904078967074816

Thank you! ❤️

amankr-novo commented 1 month ago

Hey there, Any update on this? I am too facing this similar issue with JSON configurations files