mirror of
https://github.com/spf13/viper
synced 2024-11-05 20:57:01 +00:00
Watch the entire config dir for changes
Then checking the file name in the event handler. This seems to be the only robust way of handling changes from a single file on multiple platforms and editors. See #142
This commit is contained in:
parent
cc70319ebc
commit
a212099cbe
1 changed files with 13 additions and 6 deletions
19
viper.go
19
viper.go
|
@ -237,17 +237,24 @@ func (v *Viper) WatchConfig() {
|
|||
}
|
||||
defer watcher.Close()
|
||||
|
||||
// we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way
|
||||
configFile := filepath.Clean(v.getConfigFile())
|
||||
configDir, _ := filepath.Split(configFile)
|
||||
|
||||
done := make(chan bool)
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case event := <-watcher.Events:
|
||||
if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create {
|
||||
err := v.ReadInConfig()
|
||||
if err != nil {
|
||||
log.Println("error:", err)
|
||||
// we only care about the config file
|
||||
if filepath.Clean(event.Name) == configFile {
|
||||
if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create {
|
||||
err := v.ReadInConfig()
|
||||
if err != nil {
|
||||
log.Println("error:", err)
|
||||
}
|
||||
v.onConfigChange(event)
|
||||
}
|
||||
v.onConfigChange(event)
|
||||
}
|
||||
case err := <-watcher.Errors:
|
||||
log.Println("error:", err)
|
||||
|
@ -255,7 +262,7 @@ func (v *Viper) WatchConfig() {
|
|||
}
|
||||
}()
|
||||
|
||||
watcher.Add(v.getConfigFile())
|
||||
watcher.Add(configDir)
|
||||
<-done
|
||||
}()
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue