应用程序configuration文件

好的,所以我不想在这里开始一场神圣的战争,但是我们正在试图巩固我们处理我们的应用程序configuration文件的方式,并且我们正在努力做出决定采取最好的方法。 目前,我们发布的每个应用程序都使用它自己的临时configuration文件,无论是属性文件(ini风格),XML还是JSON(目前只有内部使用!)。

我们目前的大部分代码都是Java,所以我们一直在看Apache Commons Config ,但是我们发现它非常冗长。 我们也看了一下XMLBeans ,但看起来好像很多。 我也觉得自己被推向XML是一种格式,但是我的客户和同事对尝试别的东西感到担忧。 我可以从客户的angular度来理解,每个人都听说过XML,但是在一天结束的时候,不应该使用正确的工具来完成这项工作。

现在人们在生产系统中使用什么样的格式和库,是否有人试图避免使用尖括号税 ?

编辑:真的需要成为一个跨平台的解决scheme:Linux,Windows,Solaris等,用于连接configuration文件的库的select与格式的select一样重要。

XML XML XML XML。 我们在这里configuration文件 。 如果你没有序列化对象在性能密集的情况下,没有“angular括号税”。

除了机器可读,configuration文件必须是人类可读和人类可以理解的。 XML是两者之间的一个很好的折衷。

如果您的商店有人害怕这种新兴的XML技术,我感觉不好。

YAML,原因很简单,与XML相比,它使得configuration文件非常易读。

XML:

<user id="babooey" on="cpu1"> <firstname>Bob</firstname> <lastname>Abooey</lastname> <department>adv</department> <cell>555-1212</cell> <address password="xxxx">ahunter@example1.com</address> <address password="xxxx">babooey@example2.com</address> </user> 

YAML:

  babooey: computer : cpu1 firstname: Bob lastname: Abooey cell: 555-1212 addresses: - address: babooey@example1.com password: xxxx - address: babooey@example2.com password: xxxx 

这个例子摘自这个页面: http : //www.kuro5hin.org/story/2004/10/29/14225/062

首先:这是一个非常大的辩论问题,不是一个快速的Q + A。

现在我最喜欢的就是简单的包含Lua ,因为

  • 我可以允许像width = height *(1 + 1/3)
  • 我可以使自定义function可用
  • 我可以禁止任何其他事情。 (例如Python(包括pickles)是不可能的)
  • 无论如何,我可能需要在项目的其他地方使用脚本语言。

另一个select,如果有大量的数据是使用sqlite3 ,因为他们是正确的要求

  • 小。
  • 快速。
  • 可靠。

select任何三个。

我想补充一点:

  • 备份是一个快照。 (只需复制数据库文件。)
  • 更容易切换到另一个数据库,ODBC,不pipe。 (比从fugly文件)

但是,这又是一个更大的问题。 一个“大”的答案可能涉及某种特征matrix或情况列表,如:

数据量或运行时间短

  • 对于大量的数据,你可能需要高效的存储,比如db。
  • 对于短期运行(经常),你可能想要一些你不需要做很多parsing的东西,直接考虑一下可以被mmap:ed的东西。

configuration与什么有关?

  • 主办:
    • 我喜欢/ etc中的YAML。 这是在Windows重新实现吗?
  • 用户:
    • 你允许用户使用文本编辑器编辑configuration吗?
    • 它应该集中pipe理吗? registry/ gconf /远程数据库?
    • 可能用户有几个不同的configuration文件
  • 项目:
    • 文件在项目目录? (版本控制通常遵循这个模型…)

复杂

  • 只有几个平面值? 考虑YAML。
  • 数据是嵌套的,还是依赖于某种方式? (这是有趣的地方。)
  • 可能是允许某种forms的脚本的理想function?
  • 模板可以被看作是一种configuration文件。

没有开始一场新的圣战,“尖括号税”岗位的情绪是我主要不同意杰夫的一个领域。 XML没有什么问题,它是合理的人类可读的(就像YAML或JSON或INI文件一样),但记住它的意图是被机器读取。 大多数语言/框架组合带有一些免费的XMLparsing器,这使得XML成为一个不错的select。

另外,如果您使用的是像Visual Studio这样的好IDE,并且XML带有一个模式,那么您可以将该模式指定给VS,并且魔法般地获得智能(例如,您可以为NHibernate获得一个)。

在这种情况下,你需要考虑一下你在生产中多久会触碰这些文件,可能不会经常这样。

这仍然说这一切都是为了我的XML和为什么它仍然是一个有效的selectconfiguration文件(从蒂姆布雷 ):

“如果你想提供通用的数据,接收者可能想要做出不可预见的奇怪和疯狂的事情,或者如果你想成为真正的偏执和挑剔的i18n,或者如果你发送更像是一个文件比一个结构,或者如果数据的顺序很重要,或者如果数据可能是长期存在的(比如超过几秒钟),那么XML就是要走的路了,在我看来,XML和XPath的结合碰到了一个对于那些需要扩展的数据格式来说,这是一个甜蜜的地方;也就是说,编写XML处理代码是非常简单的,在不改变消息格式的情况下,不会失败。 “

@Guy

但是应用程序configuration并不总是只有键/值对。 看看像Tomcatconfiguration的东西,它监听的端口。 这是一个例子:

  <Connector port="80" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" /> <Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" /> 

您可以有任意数量的连接器。 在文件中定义更多,并存在更多的连接器。 不要再定义和不再存在。 用普通的旧键/值对来做这件事,没有什么好的方法(imho)。

如果你的应用程序的configuration很简单,那么像INI文件这样简单的东西就可以读取到字典中了。 但是对于像服务器configuration这样更复杂的事情来说,INI文件将是一个巨大的痛苦,而更像XML或YAML这样的结构会更好。 这一切都取决于问题集。

我们正在使用ini样式的configuration文件。 我们使用Nini库来pipe理它们。 妮妮使它非常容易使用。 Nini是为.NETdevise的,但是已经使用Mono移植到其他平台。

XML,JSON,INI。
他们都有自己的长处和短处。
在应用上下文中,我觉得抽象层是重要的。
如果您可以select一种方式来构build数据,这是人类可读性和您想要访问/抽象代码中的数据之间的良好中间地带,那么您就是最好的select。

我们主要在我工作的地方使用XML,而且我不能真正相信configuration文件在第一次读取或写入之后作为对象加载到caching中,然后从程序的其余部分抽象出来,实际上是无论是CPU还是磁盘空间都没有问题。
而且它也是非常可读的,只要你正确地构build文件。

所有平台上的所有语言都通过一些相当常见的库来支持XML。

@Herms

我的意思是坚持推荐的方式,软件应该存储任何给定平台的configuration值。

你经常得到的东西也是推荐的方法,应该/可以修改。 就像“系统首选项”应用程序(用于系统服务软件)中的程序或configuration面板中的configuration菜单一样。 不让最终用户通过RegEdit或NotePad直接修改它们…

为什么?

  1. 最终用户(=客户)习惯于他们的平台
  2. 备份系统可以更好地保存“安全设置”等

@ninesided

关于“ 库的select ”,尝试链接(静态链接)任何选定的库以降低在最终用户机器上进入版本冲突的风险。

也许在这里有一点切线,但我的意见是,应用程序第一次启动时,configuration文件应该被读取到一个键值字典/哈希表,并始终通过这个对象访问速度。 通常键/值表开始作为stringstring,但辅助function的对象做这样的DateTime GetConfigDate(string键)等等…

如果你的configuration文件是一次写入,只读启动,而你的数据是一堆名称值对,你最好的select是你的开发人员可以先工作。

如果你的数据更复杂一点,嵌套等,你可能会更好使用YAML,XML或SQLite。

如果您需要嵌套的数据和/或启动后查询configuration数据的能力,请使用XML或SQLite。 两者都有相当好的查询语言(XPATH和SQL)的结构化/嵌套数据。

如果你的configuration数据是高度规范化的(例如第五范式),你最好用SQLite,因为SQL更适合处理高度规范化的数据。

如果您打算在程序运行期间写入configuration数据集,那么最好使用SQLite。 例如,如果您正在从另一台计算机下载configuration数据,或者如果您正在根据之前程序执行中收集的数据制定未来的程序执行决策。 SQLite实现了一个非常强大的数据存储引擎,当发生停电或者由于错误而处于不一致状态的程序时,这个引擎很难被破坏。 易受攻击的数据导致高昂的现场支持成本,SQLite将比任何自行开发的解决scheme,甚至XML或YAML的stream行库做得更好。

看看我的页面了解SQLite的更多信息。

据我所知,Windowsregistry不再是存储configuration的首选方式,如果您正在使用.NET – 大多数应用程序现在使用System.Configuration [1,2]。 因为这也是基于XML的,所以似乎一切都在朝着使用XML进行configuration的方向发展。

如果你想保持跨平台,我会说使用某种文本文件将是最好的路线。 至于这个文件的格式,你可能要考虑一个人是否要操纵它。 由于文件的可见结构,XML似乎比INI文件更容易手动操作。

至于尖括号征税 – 我不担心太多,因为XML库负责提取它。 唯一可能的考虑是如果你有很less的存储空间来处理和每个字节计数。

[1] System.Configuration命名空间 – http://msdn.microsoft.com/en-us/library/system.configuration.aspx

[2]在.NET中使用应用程序configuration文件 – http://www.developer.com/net/net/article.php/3396111

我们正在使用属性文件,只是因为Java本身支持它们。 几个月前,我看到SpringSource Application Platform使用JSON来configuration他们的服务器,它看起来很有趣。 我比较了各种configuration符号,并得出了XML似乎是目前最合适的结论。 它有很好的工具支持,而且是相当平台独立的。

回复:epatel的评论

我认为最初的问题是询问pipe理员将要完成的应用程序configuration,而不仅仅是存储用户首选项。 您给出的build议似乎比用户configuration更适合用户configuration,而且通常不是用户直接处理的东西(应用程序应在UI中提供configuration选项,然后更新文件)。 我真的希望你永远不会让用户不得不查看/编辑registry。 🙂

至于实际的问题,我会说XML可能是好的,因为大量的人将用于configuration。 只要您以易于使用的方式组织configuration值,那么“尖括号税”就不会太差。

我认为唯一重要的是select一个你喜欢的格式,并且可以快速导航。 XML和JSON都是很好的configuration格式,并得到广泛的支持 – 技术实现并不是问题的症结所在。 这是什么使configuration文件的任务更容易的100%。

我已经开始使用JSON了,因为我把它作为一种数据传输格式,并且序列化器可以很容易地加载到任何开发框架中。 我发现JSON比XML更容易阅读,这使得处理多个服务,每个使用一个经常修改的configuration文件,这对我来说更加经济!

你在做什么平台? 我build议尝试使用首选/通用的方法。

  1. MacOSX – plists
  2. Win32 – registry(或者在这里有一个新的,自从我开发)
  3. Linux / Unix – 〜/ .apprc(名字值也许)