World of Warcraft WTF Manager 是什么?#
WTF 是什么?#
在魔兽世界客户端文件目录下, 都有一个 WTF 文件. 里面包含了各种客户端的配置, 例如分辨率, 视频, 声音, 界面. 以及对于每一个 Account, 每一个服务器上的 Realm, 每一个游戏角色, 它们的游戏界面配置, 插件配置, 宏命令配置等一切配置. 通常如果你更换电脑玩魔兽, 就只要将整个 WTF (配置目录) 和 Addon (插件目录) 复制到新电脑上, 就能按跟之前一摸一样的配置玩游戏了.
管理 WTF 配置文件的痛点#
首先我们要明确, 备份 WTF 文件不是痛点, 因为你只要备份整个 WTF 文件夹即可. 而灵活的批量修改 WTF 文件才是痛点. 每一个游戏角色背后都有一系列的 WTF 文件. 管理 WTF 的本质就是管理 游戏角色, 和具体的配置之间的关系. 这是一个典型的多对多的关系. 有的配置需要被这几个角色公用, 有的要被那几个角色公用. 今天这个角色用这个配置, 明天对这个配置修改了, 想要引用到其他的角色上. 这才是管理的复杂度来源.
WTF 配置文件管理系统设计#
管理配置文件这个事情的本质就是将特定的 配置 (Configuration), 应用到特定的 作用域 (Scope) 中. 这个 配置 可以是界面设置, 可以是插件设置, 可以是宏命令设置. 而 作用域 可以是一个具体的角色, 或是一个具体的服务器, 或是一个具体的账号下的所有服务器所有角色, 或是所有账号下的所有服务器所有角色.
基于这一本质, 参考各种计算机业内的的配置管理工具的设计, wow_wtf_manager 定义了这么几个概念:
配置: 一个具体的配置. 例如客户端配置的
Config.wtf文件就是一个配置. 账号下所有角色的快捷键绑定配置的bindings-cache.wtf文件也是一个配置.参数: 一个配置文件的内容并不是写死的, 它允许用一些参数来动态生成最后的配置. 这里我们使用了 jinja 模板语言作为动态生成配置的工具.
作用域: 将配置应用到的具体场景. 例如单个游戏角色是一个应用作用域, 一个服务器下的所有角色, 一个账号下的所有服务器, 所有账号, 这些都是不同的应用作用域. 作用域之间是有层级关系的, 例如所有账号的作用域是最高的, 而具体的游戏角色是最低的作用域.
基于这几个概念, 最终生成配置文件的过程就简化成了:
从数据存储中读取配置的模板.
基于模板和参数动态生成配置的数据.
将配置数据写入到目标配置文件中.
那么对大批量的配置文件进行管理的流程就简化成了:
枚举一堆配置.
枚举一堆作用域.
将配置和应用作用域关联起来. 这个关联的关系可以随心所欲的修改.
在这个大框架下, 我们成功的将 配置数据 分拆成了 配置模板 和 配置参数 两部分. 同时一份动态生成的配置数据可以被应用到多个作用域中. 这样做提高了配置的复用性, 增加了配置的灵活性.