-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement viper.BindStruct for automatic unmarshalling from environment variables #1429
Conversation
👋 Thanks for contributing to Viper! You are awesome! 🎉 A maintainer will take a look at your pull request 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, https://twitter.com/sagikazarmark/status/1306904078967074816 Thank you! ❤️ |
Thanks for sending this PR! I'll try to prioritize reviewing it, especially since it resolves a long standing problem. |
Can we get an update on this? |
@sagikazarmark It would be great to get this PR merged. Can you check it, please? |
Hello, I tried this PR quickly on my personal configuration, and can tell that it does not work with slices/arrays. It might be a problem with mapstructure though. |
Hi, sorry for not adding an example. I will try to add one later. I was talking about slices of structs. This kind of structure is fully supported on other formats, like JSON, Yaml, Toml etc. But I don't know if it will be with environment variables. |
Any update on this would be appreciated, is there any work around on this, stuck with deployment on this now :( |
One approach that has worked for me is to utilize the For instance, if you have a configuration key viper.BindEnv("server.env", "SERVER_ENV") After this binding, you should be able to access the value of the SERVER_ENV environment variable using the corresponding configuration key in your application. |
Visit manually env to bind every possibly related environment variable to be able to unmarshall those into a struct. More context on spf13/viper#1429.
Visit manually env to bind every possibly related environment variable to be able to unmarshall those into a struct. More context on spf13/viper#1429.
Any update on this PR? Having to add an extra |
Apologies for the late review everyone. Using BindEnv as a workaround sounds OK, but maybe we could come up with a better solution specifically for Unmarshal. The original reason why Unmarshal does not work with AutomaticEnv is this: internally, Unmarshall gets a list of keys already registered in Viper and builds the input for mapstructure from those keys. Implementation: https://github.com/spf13/viper/blob/master/viper.go#L2098 Here is what I propose:
Practically, we probably need an internal implementation of AllSettings that does that just for Unmarshal (we may be able to merge those back together later, but technically it could be a BC break since those keys don't necessarily have any values). I'm a little weary to accept this PR as it is, because I don't think BindEnv is the right solution, it's rather a workaround. I'm happy to give this a go in the next coming weeks, but if anyone wants to pick it up first, I'm happy to review PRs too. |
Hey @sagikazarmark ! I just opened a PR to move the implementation out of a new method to the |
Hey @sagikazarmark, thanks for taking a look at this! Just want to make sure I fully understand what you propose.
Do you mean Lines 210 to 216 in c4dcd31
If so, this would mean those keys need to be merged with existing keys according to some priority within Lines 2018 to 2035 in c4dcd31
Since both Also, do you have any examples in mind where internally using Thanks! |
Since @krakowski is taking a look at this. I'll close my PR for now. |
Yes
I would say, BindStruct should come with the lowest priority. Any call to SetDefault, BindEnv or any other source should have a higher priority. In my mind
In my mind,
See my answer above. Currently only
On second thought, I'm thinking maybe we should merge BindStruct's functionality into Unmarshal. Instead of a separate BindStruct call, we could just do all that within Unmarshal. We wouldn't have to store the keys in Viper either. |
I will refactor this PR today to reflect this change making That way, from the view of a user, only |
0ac9227
to
36b31a1
Compare
@sagikazarmark This is now implemented. Please have a look 🙂 One thing I noticed: There's also Lines 1103 to 1105 in c4dcd31
Calling func (v *Viper) UnmarshalKey(key string, rawVal any, opts ...DecoderConfigOption) error {
if err := v.BindEnv(key); err != nil {
return err
}
return decode(v.Get(key), defaultDecoderConfig(rawVal, opts...))
} What do you think? |
I don't think we need to do this for |
viper.go
Outdated
return err | ||
} | ||
|
||
structKeys := v.flattenAndMergeMap(map[string]bool{}, envKeysMap, "") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These keys should be merged with the list of AllKeys instead. No need to call BindEnv.
@krakowski Thanks for updating the PR! I thought we agreed not to call BindEnv, but to change the way AllSettings is called and merge the list of keys with AllKeys. |
Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
I quickly made my own version: #1699 @krakowski I'd love to get your thoughts on it (if you can give it a try, even better). |
so this doesnt work? any ideas for workarounds? |
tried it with the latest version with no luck. |
@xsteadfastx you should use |
im using mapstructure.
…On Do, 14. Dez 05:08, Márk Sági-Kazár wrote:
@xsteadfastx you should use `mapstructure` struct tag instead of `yaml`. Not sure if that's the only problem, but that is one.
--
Reply to this email directly or view it on GitHub:
#1429 (comment)
You are receiving this because you were mentioned.
Message ID: ***@***.***>
|
This comment was marked as outdated.
This comment was marked as outdated.
@maxisam It seems type StorageConfig struct {
Size int `mapstructure:"size"`
}
type Configuration struct {
Storage StorageConfig `mapstructure:"filesystem"`
} Decoding the A simple workaround you can use is to bind this key manually using ...
v.AutomaticEnv()
os.Setenv("EVCC_DATABASE_TYPE", "sqlite")
os.Setenv("EVCC_DATABASE_DSN", "dsn")
os.Setenv("EVCC_TEST_ENV", "test-env")
v.BindEnv("test.env")
... Another option is to not use pointer fields inside the configuration structs. |
@krakowski Thanks for explaining, I knew it must be pointer type. I think using pointer type should be pretty common, but maybe I am wrong. (I only use Golang in this project) I also wanna point it out this is actually a breaking change. After this, we can't no longer use pointer type with environment variable. But it was fine before. I like the idea of this change but I think the pointer type is a big gotcha and limit the usage a lot |
why do you think im using yaml? i mean i didnt event posted any code. |
@maxisam to be precise: mapstructure doesn't support multiple indirections. In fact, it requires you to pass a pointer to your desired output, but in case of the input it only dereferences a pointer once which results in the error seen before. I submitted a PR to mapstructure to fix that. No idea when or if it' going to be accepted. I have another PR in Viper as a workaround: #1707 @xsteadfastx this is what makes me believe you use It works, as long as you tell mapstructure to use that instead of But as @andig pointed out, slices may be another issue. |
@maxisam The code you posted did not work before this change (or ever) either. Please see the following replit based on viper Before this change you needed to call |
@krakowski it did work before. I had an unit test for that. I load config first and load env variable. I meant not the test code I post here but the real code in my repo. |
@sagikazarmark Thanks for explaining. I hope your PR will work. In the meantime I will just use <1.8.0 with a workaround. |
Has this been made publicly available? In the code, I am seeing a check, which in my case defaults to const BindStruct = false How do I turn this on within my project? |
Whoever arrives here looking for how to enable this feature, you need to add the You can still make your life easier by enabling those build flags in your VS Code configuration too: {
"gopls": {
"build.buildFlags": ["-tags=viper_bind_struct"]
},
"go.buildFlags": ["-tags=viper_bind_struct"],
"go.testFlags": ["-tags=viper_bind_struct"]
} @sagikazarmark any idea on whether this feature will be enabled by default in future releases? |
@preslavrachev There is much more context for why this was put behind a build flag here: #1706 Basically, that code caused regressions in specific cases and so it was put behind a flag until it is fully backwards-compatible. |
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [github.com/spf13/viper](https://togithub.com/spf13/viper) | `v1.16.0` -> `v1.18.2` | [![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fspf13%2fviper/v1.18.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fspf13%2fviper/v1.18.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fspf13%2fviper/v1.16.0/v1.18.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fspf13%2fviper/v1.16.0/v1.18.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>spf13/viper (github.com/spf13/viper)</summary> ### [`v1.18.2`](https://togithub.com/spf13/viper/releases/tag/v1.18.2) [Compare Source](https://togithub.com/spf13/viper/compare/v1.18.1...v1.18.2) **tl;dr Skip 1.18.0 and 1.18.1 and upgrade to this version instead.** This release fixes a regression that appears in rare circumstances when using `Unmarshal` or `UnmarshalExact` to decode values onto pointers with multiple indirection (eg. pointer to a pointer, etc). The change was introduced in 1.18.0 as a means to resolve a long-standing bug when decoding environment variables to structs. The feature is now disabled by default and can be enabled using the `viper_bind_struct` build tag. It's also considered experimental at this point, so breaking changes may be introduced in the future. #### What's Changed ##### Bug Fixes 🐛 - feat!: hide struct binding behind a feature flag by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1715](https://togithub.com/spf13/viper/pull/1715) **Full Changelog**: spf13/viper@v1.18.1...v1.18.2 ### [`v1.18.1`](https://togithub.com/spf13/viper/releases/tag/v1.18.1) [Compare Source](https://togithub.com/spf13/viper/compare/v1.18.0...v1.18.1) <!-- Release notes generated using configuration in .github/release.yml at v1.18.1 --> #### What's Changed ##### Bug Fixes 🐛 - Merge missing struct keys inside UnmarshalExact by [@​krakowski](https://togithub.com/krakowski) in [https://github.com/spf13/viper/pull/1704](https://togithub.com/spf13/viper/pull/1704) **Full Changelog**: spf13/viper@v1.18.0...v1.18.1 ### [`v1.18.0`](https://togithub.com/spf13/viper/releases/tag/v1.18.0) [Compare Source](https://togithub.com/spf13/viper/compare/v1.17.0...v1.18.0) #### Major changes Highlighting some of the changes for better visibility. Please share your feedback in the Discussion forum. Thanks! ❤️ ##### `AutomaticEnv` works with `Unmarshal` Previously, environment variables that weren't bound manually or had no defaults could not be mapped by `Unmarshal`. (The problem is explained in details in this issue: [#​761](https://togithub.com/spf13/viper/issues/761)) [#​1429](https://togithub.com/spf13/viper/issues/1429) introduced a solution that solves that issue. #### What's Changed ##### Enhancements 🚀 - chore: rename files according to enabled build tags by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1642](https://togithub.com/spf13/viper/pull/1642) - test: replace ifs with asserts to simplify tests by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1656](https://togithub.com/spf13/viper/pull/1656) - ci: enable test shuffle and fix tests by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1643](https://togithub.com/spf13/viper/pull/1643) - fix: gocritic lint issues by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1696](https://togithub.com/spf13/viper/pull/1696) ##### Bug Fixes 🐛 - Implement viper.BindStruct for automatic unmarshalling from environment variables by [@​krakowski](https://togithub.com/krakowski) in [https://github.com/spf13/viper/pull/1429](https://togithub.com/spf13/viper/pull/1429) - fix isPathShadowedInFlatMap type cast bug by [@​linuxsong](https://togithub.com/linuxsong) in [https://github.com/spf13/viper/pull/1585](https://togithub.com/spf13/viper/pull/1585) ##### Dependency Updates ⬆️ - build(deps): bump github/codeql-action from 2.21.9 to 2.22.3 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1661](https://togithub.com/spf13/viper/pull/1661) - build(deps): bump golang.org/x/net from 0.15.0 to 0.17.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1659](https://togithub.com/spf13/viper/pull/1659) - build(deps): bump actions/checkout from 4.1.0 to 4.1.1 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1663](https://togithub.com/spf13/viper/pull/1663) - build(deps): bump actions/github-script from 6.4.1 to 7.0.1 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1686](https://togithub.com/spf13/viper/pull/1686) - build(deps): bump github/codeql-action from 2.22.3 to 2.22.8 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1688](https://togithub.com/spf13/viper/pull/1688) - build(deps): bump github.com/spf13/afero from 1.10.0 to 1.11.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1692](https://togithub.com/spf13/viper/pull/1692) - build(deps): bump actions/dependency-review-action from 3.1.0 to 3.1.4 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1690](https://togithub.com/spf13/viper/pull/1690) - build(deps): bump cachix/install-nix-action from 23 to 24 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1689](https://togithub.com/spf13/viper/pull/1689) - build(deps): bump github.com/nats-io/nkeys from 0.4.5 to 0.4.6 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1672](https://togithub.com/spf13/viper/pull/1672) - build(deps): bump github.com/spf13/cast from 1.5.1 to 1.6.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1691](https://togithub.com/spf13/viper/pull/1691) - build(deps): bump github.com/fsnotify/fsnotify from 1.6.0 to 1.7.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1668](https://togithub.com/spf13/viper/pull/1668) - chore: update dependencies by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1694](https://togithub.com/spf13/viper/pull/1694) - chore: update crypt by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1701](https://togithub.com/spf13/viper/pull/1701) ##### Other Changes - Add info about multiple hosts for remote config by [@​KaymeKaydex](https://togithub.com/KaymeKaydex) in [https://github.com/spf13/viper/pull/1684](https://togithub.com/spf13/viper/pull/1684) - refactor: drop fsonitfy wrapper by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1693](https://togithub.com/spf13/viper/pull/1693) - Note Get\* behavior on parse failure by [@​scop](https://togithub.com/scop) in [https://github.com/spf13/viper/pull/1687](https://togithub.com/spf13/viper/pull/1687) - fix: godot lint issues by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1657](https://togithub.com/spf13/viper/pull/1657) #### New Contributors - [@​KaymeKaydex](https://togithub.com/KaymeKaydex) made their first contribution in [https://github.com/spf13/viper/pull/1684](https://togithub.com/spf13/viper/pull/1684) - [@​krakowski](https://togithub.com/krakowski) made their first contribution in [https://github.com/spf13/viper/pull/1429](https://togithub.com/spf13/viper/pull/1429) - [@​linuxsong](https://togithub.com/linuxsong) made their first contribution in [https://github.com/spf13/viper/pull/1585](https://togithub.com/spf13/viper/pull/1585) **Full Changelog**: spf13/viper@v1.17.0...v1.18.0 ### [`v1.17.0`](https://togithub.com/spf13/viper/releases/tag/v1.17.0) [Compare Source](https://togithub.com/spf13/viper/compare/v1.16.0...v1.17.0) #### Major changes Highlighting some of the changes for better visibility. Please share your feedback in the Discussion forum. Thanks! ❤️ ##### Minimum Go version: 1.19 Viper now requires Go 1.19 This change ensures we can stay up to date with modern practices and dependencies. ##### `log/slog` support **\[BREAKING]** Viper [v1.11.0](https://togithub.com/spf13/viper/releases/tag/v1.11.0) added an experimental `Logger` interface to allow custom implementations (besides [jwalterweatherman](https://togithub.com/spf13/jwalterweatherman)). In addition, it also exposed an experimental `WithLogger` function allowing to set a custom logger. This release deprecates that interface in favor of [log/slog](https://pkg.go.dev/log/slog) released in Go 1.21. > \[!WARNING] > `WithLogger` accepts an [\*slog.Logger](https://pkg.go.dev/log/slog#Logger) from now on. To preserve backwards compatibility with older Go versions, prior to Go 1.21 Viper accepts a [\*golang.org/x/exp/slog.Logger](https://pkg.go.dev/golang.org/x/exp/slog#Logger). The experimental flag is removed. ##### New finder implementation **\[BREAKING]** As of this release, Viper uses a new library to look for files, called [locafero](https://togithub.com/sagikazarmark/locafero). The new library is better covered by tests and has been built from scratch as a general purpose file finder library. The implementation is experimental and is hidden behind a `finder` build tag. > \[!WARNING] > The `io/fs` based implementation (that used to be hidden behind a `finder` build tag) has been removed. #### What's Changed ##### Exciting New Features 🎉 - Add NATS support by [@​hooksie1](https://togithub.com/hooksie1) in [https://github.com/spf13/viper/pull/1590](https://togithub.com/spf13/viper/pull/1590) - Add slog support by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1627](https://togithub.com/spf13/viper/pull/1627) ##### Enhancements 🚀 - chore: add local development environment using nix by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1572](https://togithub.com/spf13/viper/pull/1572) - feat: add func GetEnvPrefix by [@​baruchiro](https://togithub.com/baruchiro) in [https://github.com/spf13/viper/pull/1565](https://togithub.com/spf13/viper/pull/1565) - Improve dev env by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1575](https://togithub.com/spf13/viper/pull/1575) - fix: code optimization by [@​testwill](https://togithub.com/testwill) in [https://github.com/spf13/viper/pull/1557](https://togithub.com/spf13/viper/pull/1557) - test: remove not needed testutil.Setenv by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1610](https://togithub.com/spf13/viper/pull/1610) - new finder library based on afero by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1625](https://togithub.com/spf13/viper/pull/1625) - refactor: make use of `strings.Cut` by [@​scop](https://togithub.com/scop) in [https://github.com/spf13/viper/pull/1650](https://togithub.com/spf13/viper/pull/1650) ##### Breaking Changes 🛠 - feat: drop support for Go 1.17 by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1574](https://togithub.com/spf13/viper/pull/1574) ##### Dependency Updates ⬆️ - build(deps): bump mheap/github-action-required-labels from 4 to 5 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1563](https://togithub.com/spf13/viper/pull/1563) - build(deps): bump github.com/stretchr/testify from 1.8.3 to 1.8.4 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1558](https://togithub.com/spf13/viper/pull/1558) - build(deps): bump cachix/install-nix-action from 21 to 22 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1573](https://togithub.com/spf13/viper/pull/1573) - build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.8 to 2.0.9 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1586](https://togithub.com/spf13/viper/pull/1586) - chore: upgrade crypt by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1589](https://togithub.com/spf13/viper/pull/1589) - build(deps): bump actions/checkout from 3.5.3 to 4.0.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1616](https://togithub.com/spf13/viper/pull/1616) - build(deps): bump github/codeql-action from 2.21.2 to 2.21.5 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1615](https://togithub.com/spf13/viper/pull/1615) - build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.9 to 2.1.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1614](https://togithub.com/spf13/viper/pull/1614) - build(deps): bump actions/dependency-review-action from 3.0.6 to 3.0.8 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1605](https://togithub.com/spf13/viper/pull/1605) - build(deps): bump golangci/golangci-lint-action from 3.6.0 to 3.7.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1604](https://togithub.com/spf13/viper/pull/1604) - build(deps): bump actions/setup-go from 4.0.1 to 4.1.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1593](https://togithub.com/spf13/viper/pull/1593) - build(deps): bump github.com/subosito/gotenv from 1.4.2 to 1.6.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1603](https://togithub.com/spf13/viper/pull/1603) - build(deps): bump cachix/install-nix-action from 22 to 23 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1620](https://togithub.com/spf13/viper/pull/1620) - chore(deps): update crypt by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1621](https://togithub.com/spf13/viper/pull/1621) - build(deps): bump actions/dependency-review-action from 3.0.8 to 3.1.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1623](https://togithub.com/spf13/viper/pull/1623) - Bump minimum Go version to 1.19 by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1626](https://togithub.com/spf13/viper/pull/1626) - build(deps): bump github/codeql-action from 2.21.5 to 2.21.6 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1632](https://togithub.com/spf13/viper/pull/1632) - build(deps): bump github/codeql-action from 2.21.6 to 2.21.7 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1634](https://togithub.com/spf13/viper/pull/1634) - build(deps): bump actions/checkout from 4.0.0 to 4.1.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1641](https://togithub.com/spf13/viper/pull/1641) - build(deps): bump github.com/spf13/afero from 1.9.5 to 1.10.0 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1640](https://togithub.com/spf13/viper/pull/1640) - build(deps): bump github/codeql-action from 2.21.7 to 2.21.8 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1638](https://togithub.com/spf13/viper/pull/1638) - build(deps): bump github/codeql-action from 2.21.8 to 2.21.9 by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/spf13/viper/pull/1648](https://togithub.com/spf13/viper/pull/1648) - chore(deps): update crypt by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1652](https://togithub.com/spf13/viper/pull/1652) ##### Other Changes - \[StepSecurity] ci: Harden GitHub Actions by [@​step-security-bot](https://togithub.com/step-security-bot) in [https://github.com/spf13/viper/pull/1592](https://togithub.com/spf13/viper/pull/1592) - Add Vitess to list of projects using Viper by [@​systay](https://togithub.com/systay) in [https://github.com/spf13/viper/pull/1619](https://togithub.com/spf13/viper/pull/1619) - docs: fix typos in comments by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1609](https://togithub.com/spf13/viper/pull/1609) - ci: add Go 1.21 to the test matrix by [@​sagikazarmark](https://togithub.com/sagikazarmark) in [https://github.com/spf13/viper/pull/1622](https://togithub.com/spf13/viper/pull/1622) - Remove usages of deprecated io/ioutil; simplify viper tests by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1631](https://togithub.com/spf13/viper/pull/1631) - chore: remove deprecated build tags by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1630](https://togithub.com/spf13/viper/pull/1630) - refactor: replace 'interface{}' with 'any' by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1646](https://togithub.com/spf13/viper/pull/1646) - test: refactor asserts by [@​alexandear](https://togithub.com/alexandear) in [https://github.com/spf13/viper/pull/1644](https://togithub.com/spf13/viper/pull/1644) - docs: add set subset KV example by [@​yhliyr](https://togithub.com/yhliyr) in [https://github.com/spf13/viper/pull/1647](https://togithub.com/spf13/viper/pull/1647) - Make deps fixes by [@​bersace](https://togithub.com/bersace) in [https://github.com/spf13/viper/pull/1628](https://togithub.com/spf13/viper/pull/1628) #### New Contributors - [@​goldeneggg](https://togithub.com/goldeneggg) made their first contribution in [https://github.com/spf13/viper/pull/1561](https://togithub.com/spf13/viper/pull/1561) - [@​baruchiro](https://togithub.com/baruchiro) made their first contribution in [https://github.com/spf13/viper/pull/1565](https://togithub.com/spf13/viper/pull/1565) - [@​testwill](https://togithub.com/testwill) made their first contribution in [https://github.com/spf13/viper/pull/1557](https://togithub.com/spf13/viper/pull/1557) - [@​step-security-bot](https://togithub.com/step-security-bot) made their first contribution in [https://github.com/spf13/viper/pull/1592](https://togithub.com/spf13/viper/pull/1592) - [@​systay](https://togithub.com/systay) made their first contribution in [https://github.com/spf13/viper/pull/1619](https://togithub.com/spf13/viper/pull/1619) - [@​alexandear](https://togithub.com/alexandear) made their first contribution in [https://github.com/spf13/viper/pull/1609](https://togithub.com/spf13/viper/pull/1609) - [@​hooksie1](https://togithub.com/hooksie1) made their first contribution in [https://github.com/spf13/viper/pull/1590](https://togithub.com/spf13/viper/pull/1590) - [@​yhliyr](https://togithub.com/yhliyr) made their first contribution in [https://github.com/spf13/viper/pull/1647](https://togithub.com/spf13/viper/pull/1647) - [@​bersace](https://togithub.com/bersace) made their first contribution in [https://github.com/spf13/viper/pull/1628](https://togithub.com/spf13/viper/pull/1628) - [@​scop](https://togithub.com/scop) made their first contribution in [https://github.com/spf13/viper/pull/1650](https://togithub.com/spf13/viper/pull/1650) **Full Changelog**: spf13/viper@v1.16.0...v1.17.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/infratographer/x). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4wLjMiLCJ1cGRhdGVkSW5WZXIiOiIzNy4yNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
I have a question about the expected behavior, I hope it's fine to ask this here (not sure yet if this is a bug or intended): Is it correct that fields tagged with For example, when I change this line to be
instead, the test fails. |
Is |
Looks like it is: mitchellh/mapstructure#145 |
Description
The current
viper
implementation does not allow toviper.Unmarshal
environment variables into structs without binding them first (usingviper.BindEnv
). This behavior results in an "empty" struct (i.e no values filled) if no configuration file is provided with matching keys.This pull request adds a new
viper.BindStruct
function which takes a struct pointer and binds each (nested) struct field to an environment variable using the struct field's name or the user-specifiedmapstructure
tag. The implementation is quite simple, since I could reuse some functions:A simple example could look like this:
Please see the
TestBindStruct
unit test for a more complete example.Related Issues