我认为以下内容不会提供您正在寻找的功能,但它可能会提供一些思考空间......
假设您的应用程序名为myApp,并且-cfg <...> 命令行选项用于指定其配置的来源。您可以允许以下选项...
myApp -cfg /path/to/configuration/file.cfg
上面很明显:从指定文件中读取配置。
myApp -cfg "exec#curl -sS http://configWebServer/path/to/file.cfg"
exec# 前缀指定应执行指定的命令。预计该命令将写入标准输出。然后将该标准输出解析为配置文件。
顺便说一句,curl 代表cat URL。它是一个开源实用程序,可以使用多种协议检索文件,包括 HTTP(S)、FTP(S)、LDAP 等。 -sS 到 curl 的命令行选项告诉它除了错误消息之外不打印诊断信息,这可能是您想要的。
"exec#..." 格式为使用其他方式检索配置信息铺平了道路。例如,来自查询数据库的脚本、来自 Subversion 存储库或任何您想要的。
您可能还希望支持以下变体:
myApp -cfg "shared_lib=foo#..."
这将加载一个名为 foo 的共享库,并在其中调用一个入口点函数,将 "..." 作为参数传递。共享库函数将决定如何处理该参数. 共享库的一种实现可能会从共享内存中检索配置信息;另一种实现可能会通过远程过程调用或套接字连接检索它;等等。
所有不同的检索机制仅负责将配置数据作为(可能很大)字符串进行检索。例如,-cfg /path/to/file.cfg 机制读取文件的全部内容并将其作为字符串(或者可能作为std::istream)返回。然后将该(可能很大的)字符串传递给“真正的”配置解析器(XML/ini/properties 文件的解析器或其他)。
我相信上述建议为您的一半问题提供了解决方案。特别是,它提供了一种插件架构来从任意来源检索配置数据,其中插件可以编写为 shell 命令或共享库。
您问题的另一半基本上是:“应用程序如何在其生命周期内动态检索更新的配置数据?”我没有解决这个要求。部分原因是我没有提供优雅的解决方案。部分原因是您没有指出可能触发重新读取配置数据的原因。
顺便说一句,我是一个名为Config4* 的 C++/Java 配置解析器库的维护者。该库提供了"exec#..." 功能的实现。我提到,如果您想检查源代码以了解如何实现此类功能。我怀疑支持"shared_lib=foo#..." 所需的代码可以很容易地以支持"exec#..." 的现有代码为模型。 “Config4* 入门指南”(可从网站以 PDF 和 HTML 格式获得)很好地讨论了 -cfg "exec#..." 功能,包括防止人们尝试执行恶意命令的安全机制。