Open
Description
Preflight Checklist
- I have searched the issue tracker for an issue that matches the one I want to file, without success.
- I am not looking for support or already pursued the available support channels without success.
- I have checked the troubleshooting guide for my problem, without success.
Viper Version
v1.18.2
Go Version
1.21.1
Config Source
Manual set
Format
YAML
Repl.it link
No response
Code reproducing the issue
package main
import (
"flag"
"fmt"
"github.com/spf13/pflag"
"github.com/spf13/viper"
)
func main() {
flag.String("source", "", "source of configuration")
pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
pflag.Parse()
viper.BindPFlags(pflag.CommandLine)
viper.SetEnvPrefix("repro")
viper.BindEnv("source")
viper.SetDefault("source", "default")
viper.SetConfigName("config") // name of config file (without extension)
viper.SetConfigType("yaml") // REQUIRED if the config file does not have the extension in the name
viper.AddConfigPath("/etc/repro/") // path to look for the config file in
viper.AddConfigPath("$HOME/.config/repro") // call multiple times to add many search paths
viper.AddConfigPath(".") // optionally look for config in the working directory
err := viper.ReadInConfig() // Find and read the config file
if err != nil { // Handle errors reading the config file
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
panic(fmt.Errorf("fatal error config file: %w", err))
}
}
fmt.Println("config source: ", viper.GetString("source"))
}
Expected Behavior
- flag should override env
- env should override all files
- local directory should override user global
- user global should override system config
- system config should overide defaults
- defaults should work
Actual Behavior
Configuration file locations are searched in order specified, which is sane and good, but the documentation suggests the opposite.
Steps To Reproduce
No response
Additional Information
Please reorder these lines.
viper.AddConfigPath("/etc/appname/") // path to look for the config file in
viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths
viper.AddConfigPath(".") // optionally look for config in the working directory
Also, consider using "$HOME/.config/appname/"
for the user directory one.
(Don't get me started on the single-dash long-args thing, I've given up on golang on that point.)
Activity