[英]How to use options for both command line and hierarchical config file with Boost Program_Options
想象一下,我有一个采用以下命令行选项的程序:
$ prog1 --foo 1
我还有一个采用这种分层格式的配置文件,其中foo
参数位于prog1
scope 中:
[prog1]
foo = 42
我对 Boost::program_options 的理解是命令行选项的定义类似于:
description.add_options()
("foo", "Set foo value");
但是我希望配置文件中的值是默认值(作为调用store()
两次的结果,首先是命令行描述,然后是配置文件描述),能够被命令行选项覆盖,但我相信配置文件选项必须声明为:
description.add_options()
("prog1.foo", "Set foo value");
注意这里prog1.foo
的使用,尤其是prog1.
字首。
所以我的问题是,如果您使用分层配置文件选项,您如何将这些与命令行选项相关联? 即如何使--foo
和prog1.foo
在存储 object 中表示相同的配置值?
我已经学到了足够的知识来回答我自己的问题。 希望有一天这会对某人有所帮助,因为 Boost::Program_Options 文档没有涵盖这一点。
如果您创建这样的分层配置选项(记录在案):
config_only_opts.add_options()
("section.option", po::bool_switch(), "Some option");
并将其传递给parse_command_line()
和parse_config_file()
。
然后配置文件将如下所示:
[section]
option=1
命令行选项如下所示(未记录):
--section.option
因此,分层选项转换为虚线命令行选项。 因此我希望这样:
[one.two]
three=4
等效于以下配置选项:
--one.two.three=4
应用于命令行或配置文件选项的默认值以您期望的方式应用,具体取决于调用store()
的顺序。
如果您想将任意命令行选项(例如--foo
)与分层(或平面)配置文件值(例如bar.baz
)相关联,则可以将前者注册到parse_command_line()
并将后者注册到parse_config_file()
,但为每个引用相同的存储变量:
bool foo;
po::options_description cmdline_opts;
cmdline_only_opts.add_options()
("foo", po::value<bool>(&foo), "Foo")
;
po::options_description config_file_opts;
config_only_opts.add_options()
("bar.baz", po::value<bool>(&foo))
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, cmdline_opts), vm);
po::store(po::parse_config_file("config.file", config_file_opts, true /* allow unregistered */), vm);
po::notify(vm);
现在您可以使用--foo
或
[bar]
baz=X
设置变量foo
。 唯一需要注意的是,您不能再使用vm[XXX].as<T>()
其中“XXX”是“foo”或“bar.baz”来访问该值 - 只需使用引用的存储变量反而。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.