Preflight Checklist

  • [X] I have searched the issue tracker for an issue that matches the one I want to file, without success.
  • [X] I am not looking for support or already pursued the available support channels without success.
  • [X] I have checked the troubleshooting guide for my problem, without success.

Viper Version

1.18.2

Go Version

1.22.3

Config Source

Files

Format

YAML

Repl.it link

https://replit.com/@TheDevMinerTV/viper-extensionless-repro

Code reproducing the issue

No response

Expected Behavior

Viper should only look at files ending with the config type set, if it has been set. Viper's README reads:

viper.SetConfigType("yaml") // REQUIRED if the config file does not have the extension in the name

I'd expect this to limit the search to only *.yaml files.

Actual Behavior

Viper checks all different kinds of files, also the one without no extension. This is usually the application's binary which obviously isn't a parsable configuration file.

Steps To Reproduce

  1. Add . to the config path
  2. Set the config type to whatever you want (just not an empty string, for example "yaml")
  3. Set the config name to the same as your binary (for example "myapp")
  4. Compile your application (so it's called, for example ./myapp) and run it

Additional Information

No response

Comment From: github-actions[bot]

👋 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! ❤️

Comment From: Serendipity565

func (v *Viper) ReadInConfig() error {
    v.logger.Info("attempting to read in config file")
    filename, err := v.getConfigFile()
    if err != nil {
       return err
    }

    if !stringInSlice(v.getConfigType(), SupportedExts) {
       return UnsupportedConfigError(v.getConfigType())
    }

    v.logger.Debug("reading file", "file", filename)
    file, err := afero.ReadFile(v.fs, filename)
    if err != nil {
       return err
    }

    config := make(map[string]any)

    err = v.unmarshalReader(bytes.NewReader(file), config)
    if err != nil {
       return err
    }

    v.config = config
    return nil
}

In the function that reads the configuration file, it only determines whether the current file type is within the supported range, and does not read the file based on this type.

Comment From: Serendipity565

viper.SetConfigName("config.yaml")
viper.SetConfigType("yaml")

Currently, if there are multiple files, you can try to specify the file format to read the corresponding files

Comment From: d0ct0rvenkman

I'm seeing this issue as well. In my case, I'm trying to specify yaml as the config format for my app, but Viper will happily load a json config file if one is present in the search path.

It seems (to me) that SupportedExts should automatically be trimmed to support extensions related to what's configred via SetConfigType() or that the user should be able to define what's contained in SupportedExts via a helper method.

Comment From: d0ct0rvenkman

Additionally, it seems like Viper will read in a json configuration file set using SetConfigFile("/path/to/file.json") just fine after specifying a YAML configuration using SetConfigType("yaml").

I would expect that this would fail because the JSON contained within the specified file is not YAML data, but it seems to load it without error.

Comment From: github-actions[bot]

Issues with no activity for 30 days are marked stale and subject to being closed.