你用什么包来处理命令行选项、设置和配置文件?
我正在寻找从命令行和/或配置文件中读取用户定义选项的东西。
选项(设置)应该可以分成不同的组,以便我可以将不同的(子集)选项传递给我的代码中的不同对象。
我知道boost::program_options
,但我不太习惯API
。有轻量级的替代品吗?
(顺便说一句,你有没有在你的代码中使用可以从任何地方读取的全局选项对象?或者你会认为这是邪恶的吗?)
你用什么包来处理命令行选项、设置和配置文件?
我正在寻找从命令行和/或配置文件中读取用户定义选项的东西。
选项(设置)应该可以分成不同的组,以便我可以将不同的(子集)选项传递给我的代码中的不同对象。
我知道boost::program_options
,但我不太习惯API
。有轻量级的替代品吗?
(顺便说一句,你有没有在你的代码中使用可以从任何地方读取的全局选项对象?或者你会认为这是邪恶的吗?)
在 Google,我们使用gflags。它不做配置文件,但对于标志,它比使用 getopt 痛苦得多。
#include <gflags/gflags.h>
DEFINE_string(server, "foo", "What server to connect to");
int main(int argc, char* argv[]) {
google::ParseCommandLineFlags(&argc, &argv, true);
if (!server.empty()) {
Connect(server);
}
}
您将 放在DEFINE_foo
需要知道标志值的文件的顶部。如果其他文件也需要知道该值,请DECLARE_foo
在其中使用。对测试也有很好的支持,所以单元测试可以独立设置不同的标志。
对于命令行和 C++,我一直是 TCLAP 的粉丝:Templatized Command Line Argument Parser。
好吧,你不会喜欢我的回答。我用boost::program_options
. 该界面需要一些时间来适应,但是一旦您将其关闭,那就太棒了。只要确保进行大量的单元测试,因为如果语法错误,就会出现运行时错误。
而且,是的,我将它们存储在一个单例对象中(只读)。在那种情况下,我不认为这是邪恶的。这是我能想到的少数几个可以接受单例的情况之一。
如果 Boost 对你来说太过分了,GNU Gengetopt也可能是,但恕我直言,它是一个有趣的工具。
而且,我尽量远离全局选项对象,我更喜欢让每个类都读取自己的配置。除了整个“全局变量是邪恶的”哲学之外,将所有配置集中在一个地方往往会变得越来越混乱,而且很难判断在哪里使用了哪些配置变量。如果您将配置保持在靠近使用位置的位置,则每个配置的用途会更加明显,并且更容易保持清洁。
(至于我个人使用的东西,最近它是我公司其他人编写的专有命令行解析库,但不幸的是,这对你没有多大帮助)
我已经使用 TCLAP 一两年了,但我偶然发现了ezOptionParser。ezOptionParser 不会像其他选项解析器那样遭受“它不应该如此复杂”的综合症。
到目前为止,我印象非常深刻,我可能会继续使用它,特别是因为它支持配置文件。TCLAP 是一个更复杂的库,但来自 ezOptionParser 的简单性和额外功能非常引人注目。
其网站的其他好处包括(截至 0.2.0):
GNU getopt 非常好。如果您想要 C++ 的感觉,请考虑getoptpp,它是原生 getopt 的包装器。就配置文件而言,你应该尽量让它变得愚蠢,以便于解析。如果你有点体贴,你可能会想使用 yaac&lex 但这对于小型应用程序来说确实是一大笔钱。
我还想建议您在应用程序中同时支持配置文件和命令行选项。配置文件更适合那些更改频率较低的选项。当您想要传递即时变化的参数时(通常是在您创建一个应用程序时,它会被其他程序调用),命令行选项非常有用。
如果您在 x86 和 x64 Windows 上使用 Visual Studio 2005,SimpleLibPlus 库中有一些很好的命令行解析实用程序。我用过它,发现它非常有用。
不确定命令行参数解析。我在该领域不需要非常丰富的功能,并且通常会推出自己的功能以节省向我的软件添加更多依赖项。根据您的需求,您可能想也可能不想尝试这条路线。我写的 C++ 程序一般不会从命令行调用。
另一方面,对于配置文件,您确实无法击败基于 XML 的格式。它是可读的、可扩展的、结构化的等等...... :) 另外还有很多 XML 解析器。尽管它是一个 C 库,但我倾向于使用来自 xmlsoft.org 的 libxml2。
试试Apache Ant。它的主要用途是 Java 项目,但没有任何关于它的 Java,而且它几乎可用于任何事情。
使用相当简单,您也得到了很多社区支持。它真的很擅长按照你要求的方式做事。
至于代码中的全局选项,我认为它们是非常必要和有用的。但是,不要滥用它们。