我正在寻找一种用于在跨平台C ++应用程序中管理应用程序配置的DRY模式。
理想情况下,我希望拥有一个明确的应用程序配置源,以最大限度地减少开发人员的维护负担。这可以存储为txt,XML,JSON,YAML
此文件有两个目的......
首先,它用于创建用户可访问的配置文件。
其次,它将确定在用户决定删除其全部或部分配置文件的情况下使用的默认值。
在编译时使用某种预处理器将配置文件编译到应用程序中。这似乎不可能。
创建一个读取配置文件的工具,并生成必要的代码,以便在默认值中编译到应用程序中。这可行,但是我希望避免增加构建过程的复杂性。
创建两个配置文件,一个是用户可配置的,另一个是包含默认值的隐藏文件。在应用程序启动时,将读取默认文件,然后读取用户文件,该文件通过覆盖默认值来应用用户设置。这并不理想,因为它依赖于隐藏文件来保持用户的默认值。
答案 0 :(得分:1)
Config4Cpp为您的目标提供直接支持。有关详细信息,请阅读Chapter 3 of the Config4* Getting Started Guide中有关嵌入式配置的讨论(将默认值硬编码为应用程序可执行文件)和后备配置(实质上,从中查找请求变量的值)解析配置文件,如果这不起作用,那么"回退"查找嵌入式配置中的值。)
如果您想将此方法与其他配置文件语法(例如,json或XML)一起使用,那么可以归结为以下步骤:
编写一个类似于config2cpp
的命令行实用程序(在Chapter 6 of the Config4* Getting Started Guide中讨论,将配置文件(或实际上是任何文本文件)转换为包含a的(单例)C ++类配置文件内容的快照,并可以通过公共方法提供对该快照的访问。您将使用应用程序的其余部分编译此生成的C ++类,因此应用程序具有"默认"嵌入的配置变量进入它。
使用解析器获取您喜欢的配置文件语法,但请确保解析器可以解析外部文件或嵌入式配置文件。换句话说,您应该能够执行cfg.parseFile("file.cfg")
或cfg.parseString(EmbeddedConfigurationClass::getString())
。
编写自己的"包装器"配置API类,将两个解析的配置对象作为实例变量。其中一个变量是解析的外部配置文件,另一个变量是解析的嵌入式配置数据。实现包装类的lookup()
方法,使其首先在解析的外部配置文件中查找指定的变量;如果失败,则该方法在嵌入式配置数据中查找指定的变量。
这就是它的全部内容。 Config4 *为您提供了开箱即用的上述功能,但正如我在上面的步骤中所描述的那样,应该很容易为您喜欢的配置文件语法模拟类似的功能。
顺便说一句,如果您实现此功能,那么我建议您使外部配置文件可选。这样做意味着您的应用程序将能够开箱即用,而无需用户首先显式创建配置文件。在Config4 *中,我称之为zero configuration。