在站内找到个相同帖子 https://www.v2ex.com/t/890739
问题是应该怎么升级呢?难道每个版本都实现一个类似 func Update(cfg ConfigV2)(ConfigV3, error)
的玩意? 这样岂不是每个 ConfigVx 的 struct 都得保留一份?
这种需求有没有现成的方案?
1
COW 23 天前 via Android
考虑弄一个文件,代码里用 if else 判断当前软件的版本,动态生成差异配置
|
3
COW 23 天前 via Android
@lysShub 针对配置文件本身,可以用 template 语法来生成指定版本的配置文件。
针对代码内的 config 结构体,可以引入 version 字段,根据版本使用不同配置。 case v1:config = &ConfigV1{} case v2:config = &ConfigV2{} |
4
uds9u32br 23 天前
没什么问题啊,出现 break 更新之后还想要适配旧版本还能有什么办法呢,我真不知道
|
5
kk2syc 23 天前
如果有代码洁癖的话,就抛弃配置文件自动升级,或者单独写一个配置文件升级的转换工具。
|
6
hellojukay 23 天前 via Android
参考 nginx 怎么升级配置文件的
|
7
EscYezi 23 天前 via iPad
看起来像是 json 配置文件映射到 go 结构体,如果能把配置平铺做兼容可能就简单了。
比如现在配置文件是{“a”:{“b”:{“c”:12345}}},换成 a.b.c=12345 或者还是 json 配置文件,但是用 jsonpath 来解析。 |
8
panlatent 23 天前 via Android
我的经验是不做复杂对象, 适当保留无效字段或者通过解析层处理掉无效数据。 我推荐前者,前一个大版本失效字段标记废弃,超两个大版本直接删除。
|