Một vài ghi chú về Viper

Tu Nguyen
2 min readJun 21, 2021

--

Viper là một configuration library phổ biến trong Go (Golang). API của Viper rất linh hoạt cho phép đọc configuration từ nhiều nguồn khác nhau như file, environment variable, command line flag, KV storage… Đồng thời hỗ trợ nhiều format khác nhau như JSON, YAML, TOML, INI, PROPERTIES…

Trong quá trình sử dụng Viper có phát sinh một số vấn đề khá là kì cục và khó hiểu. Ở đây mình liệt kê một số và cách giải quyết để tiết kiệm thời gian nghiên cứu cho các bạn lần đầu dùng Viper.

Độ ưu tiên

Tài liệu của Viper có nói đến độ ưu tiên của configuration nhưng không đủ và không rõ ràng.

Độ ưu tiên đầy đủ của Viper sẽ như sau:

Default Flags < SetDefault() < KV Store < File < ENV < Passed Flags < Set()

Khi test các giá trị configuration thì bạn nên dùng một số method như:

Get(key)
AllSettings()

Hành vi bất thường của Unmarshal()

Công dụng của Unmarshal() là để binding giá trị configuration vào một struct.

Thế nhưng Unmarshal() có một bug tiềm ẩn bên trong. Nó chỉ nhận giá trị configuration từ file, nếu bạn override giá trị đó bằng ENV, Flags nó sẽ không nhận.

Có nhiều người đã report bug này nhưng vẫn chưa thấy team dev giải quyết. Ở phiên bản hiện tại (v1.8.0) lúc viết bài này thì Viper vẫn bị lỗi này.

Để workaround cái bug khó chịu này bạn có thể sử dụng đoạn code dưới đây:

func overrideConfiguration() {
for _, key := range viper.AllKeys() {
val := viper.Get(key)
viper.Set(key, val)
}
}

Đoạn code trên dùng Set() để override tất cả các giá trị trong Viper và Unmarshal() sẽ hoạt động như kỳ vọng.

--

--