我有一个程序使用升压::程序选项解析命令行。其中一个参数是 AMQP 交换的名称,并提供默认值。出于测试目的,我想用空字符串覆盖此 AMQP 交换名称(以使用默认交换)。
我不知道如何将空字符串传递给升压::程序选项。那可能吗?不修改源码?如果没有,你有什么推荐?
这是一个最小的工作示例代码:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
constexpr auto EXECUTABLE_DESCRIPTION =
"Minimum working example showing my difficulties while trying to "
"pass an empty string as an argument to boost::program_options.";
int main(int argc, char **argv) {
std::string elkExchange;
po::options_description config("");
config.add_options()
("amqp.exchange",
po::value<std::string>(&elkExchange)
->default_value("default-exchange"), // default value used in prod
"Exchange on which to send the events");
// do the parsing
po::options_description cmdline_options(std::string{EXECUTABLE_DESCRIPTION});
cmdline_options.add(config);
po::variables_map args;
store(po::command_line_parser(argc, argv).
options(cmdline_options).run(), args);
notify(args);
// debug display
std::cout << "Send event on elk.exchange: {" << elkExchange << "}" << std::endl;
// real application code here ...
return EXIT_SUCCESS;
}
这是我想做的:
# default value is used as expected
$ ./boost/empty-string-in-cli/exec
Send event on elk.exchange: {default-exchange}
# override with non-empty value work as expected
$ ./boost/empty-string-in-cli/exec --amqp.exchange='custom'
Send event on elk.exchange: {custom}
# here is where the troubles begin
$ ./boost/empty-string-in-cli/exec --amqp.exchange=''
terminate called after throwing an instance of 'boost::wrapexcept<boost::program_options::invalid_command_line_syntax>'
what(): the argument for option '--amqp.exchange' should follow immediately after the equal sign
Aborted (core dumped)
提前致谢 : )
令我惊讶的是,相邻的长选项解析器绝对禁止=
使用零长度值进行符号,请参阅上的代码https://github.com/boostorg/program_options/blob/develop/src/cmdline.cpp#L520 https://github.com/boostorg/program_options/blob/develop/src/cmdline.cpp#L520.
因此,您唯一的办法似乎是避免使用相邻值语法:
for EXCHANGE in foo bar ''; do ./build/sotest --amqp.exchange "$EXCHANGE"; done
Prints
Send event on elk.exchange: {foo}
Send event on elk.exchange: {bar}
Send event on elk.exchange: {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)