Хорошо, я не хочу начинать священную войну, но мы находимся в процессе попытки консолидировать способ работы с конфигурационными файлами наших приложений, и нам трудно принять решение о наилучшем подходе. На данный момент каждое приложение, которое мы распространяем, использует свои собственные специальные файлы конфигурации, будь то файлы свойств (в стиле ini), XML или JSON (пока только для внутреннего использования!).
В настоящее время большая часть нашего кода написана на Java, поэтому мы изучили Apache Commons Config, но обнаружили, что он довольно многословен. Мы также рассмотрели XMLBeans, но он кажется нам слишком многословным. Я также чувствую, что меня подталкивают к XML как формату, но мои клиенты и коллеги опасаются пробовать что-то другое. Я могу понять это с точки зрения клиента, все слышали об XML, но в конце концов, разве не следует использовать правильный инструмент для работы?
Какие форматы и библиотеки люди используют в производственных системах в наши дни, пытается ли кто-нибудь еще избежать налога на угловые скобки?
_Edit: действительно должно быть кроссплатформенным решением: Linux, Windows, Solaris и т.д., и выбор библиотеки, используемой для взаимодействия с конфигурационными файлами, так же важен, как и выбор формата.3.
И YAML, по той простой причине, что это делает для очень легко читаются файлы конфигурации по сравнению с XML.
XML-код:
<user id="babooey" on="cpu1">
<firstname>Bob</firstname>
<lastname>Abooey</lastname>
<department>adv</department>
<cell>555-1212</cell>
<address password="xxxx">[email protected]</address>
<address password="xxxx">[email protected]</address>
</user>
И YAML:
babooey:
computer : cpu1
firstname: Bob
lastname: Abooey
cell: 555-1212
addresses:
- address: [email protected]
password: xxxx
- address: [email protected]
password: xxxx
Примеры были взяты с этой страницы: http://www.kuro5hin.org/story/2004/10/29/14225/062
Во-первых: это действительно большой вопрос дискуссии, а не быстрый Q+А.
Мой любимый сейчас-это просто включить Луа, потому что
Другой вариант, если там's большое данных является использование и sqlite3, потому что они'вэ права требования
Выбрать любые три.
На что я хотел бы добавить:
Но опять же, это большая проблема. А "большие" в ответ на это, вероятно, предполагает какую-то особенность матрицы или список ситуаций, как:
XML В ФОРМАТЕ XML XML В ФОРМАТЕ XML. Мы're говоря здесь файлы конфигурации. Там нет "угол налоговый кронштейн" Если вы'повторно не сериализации объектов в напряженной ситуации.
Конфигурационный файл должен быть читабельным и человека, понятно, в дополнение к машиносчитываемым. XML-это хороший компромисс между двумя.
Если ваш магазин есть люди, которые боятся, что новомодные технологии XML, я чувствую себя плохо для вас.
Не начиная новую священную войну, чувства, выраженные в посте 'Налог на угловые скобки' - это одна из областей, где я в основном не согласен с Джеффом. В XML нет ничего плохого, он достаточно удобен для чтения человеком (так же, как YAML, JSON или INI-файлы), но помните, что он предназначен для чтения машинами. Большинство комбинаций языка/фреймворка поставляются с каким-либо парсером XML бесплатно, что делает XML довольно хорошим выбором.
Кроме того, если вы используете хорошую IDE, такую как Visual Studio, и если XML поставляется со схемой, вы можете передать схему в VS и волшебным образом получить интеллисенс (например, вы можете получить его для NHibernate).
В конце концов, вам нужно подумать о том, как часто вы будете обращаться к этим файлам в процессе производства, вероятно, не так уж часто.
Это все еще говорит мне о XML и о том, почему он все еще является правильным выбором для файлов конфигурации (из Tim Bray):
"Если вы хотите предоставить данные общего назначения, с которыми получатель может захотеть сделать непредвиденные странные и безумные вещи, или если вы хотите быть действительно параноидальным и придирчивым к i18n, или если то, что вы отправляете, больше похоже на документ, чем на структуру, или если порядок данных имеет значение, или если данные потенциально долговечны (например, больше секунд), XML - это то, что нужно. Мне также кажется, что комбинация XML и XPath является идеальным решением для форматов данных, которые должны быть расширяемыми; то есть, довольно легко написать код обработки XML, который не даст сбоев при изменениях в формате сообщения, не затрагивающих ту часть, о которой вы заботитесь.".
@Парень
Но конфигурации приложения-это'т всегда просто пары ключ/значение. Смотреть на что-то вроде конфигурации Tomcat для какие порты он слушает. Здесь'ы пример:
<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" />
Вы можете иметь любое количество разъемов. Определить в файл и существует несколько разъемов. Дон'т определить больше и больше не существует. Там's не хороший способ (имхо) для этого старый добрый пар ключ/значение.
Если ваше приложение'ы config-это простой, то что-то простое, как ini-файл, который's прочитав в словаре, наверное, хорошо. Но на что-то более сложное, как конфигурации сервера, ini-файл будет огромная боль, чтобы поддерживать, а что-то более структурное, таких как XML или YAML будет лучше. Все зависит от поставленной задачи.
С XML, ФОРМАТ JSON, INI-ФАЙЛ. Все они имеют свои сильные и слабые стороны. В контекст приложения, я считаю, что уровень абстракции-это главное. Если вы можете выбрать способ структуризации данных, что является хорошим компромиссом между читаемости и как вы хотите получить доступ к/абстрактные данные в код, вы'вновь золотой.
Мы в основном используем XML, в котором я работаю, и я не могу действительно верить, что конфигурационный файл загружается в кэш как объекты для первого чтения или после того, как она была написана, и затем абстрагированные от остальной части программы, На самом деле является большой нажмите на ни процессора, ни дискового пространства. И это очень четкий, как долго, как вы структуру файла.
И на всех языках на всех платформах поддерживает XML через несколько довольно общих библиотек.
Мы используем стиль ini файлы конфигурации. Мы используем [Нини][1] библиотека для управления ими. Нини делает его очень проста в использовании. Нини была вообще для .Но она была портирована на другие платформы с использованием моно.
[1]: http://nini.sourceforge.net/ с "Когда и"
@Гермами
Я имел в виду, чтобы придерживаться рекомендуемой программы должны сохранять значения конфигурации для любой платформы.
Что вы часто получаете то также рекомендуемые способы эти должны/могут быть изменены. Как в меню Настройки в программе или на панели конфигурации в "Мои Системные настройки" и по применению (для системы программного обеспечения т. е. услуги). Не позволяя конечным пользователям изменять их напрямую через regedit или блокнот...
Почему?
@ninesided
О том, что " choice из library " и попробуйте перейти по ссылке в (статическая ссылка) любой выбранной библиотеке, чтобы снизить риск попадания в версии-конфликт-войны на конечных пользователей машины.
Если ваш файл конфигурации однократной записи, только для чтения-при-загрузке, а ваши данные-это куча пар имя-значение, ваш лучший выбор это ваш разработчик может начать работать в первую очередь.
Если ваши данные немного сложнее, с вложенности и т. д., Вы, вероятно, лучше про YAML, XML или базы данных SQLite.
Если вам нужны вложенные данные и/или возможность запрашивать данные конфигурации после загрузки, использовать XML или SQLite. Оба очень хорошо языки запросов (XPath и SQL) для структурированных/вложенные данные.
Если данные конфигурации весьма нормализуется (например, 5-й нормальной форме) вы лучше с SQLite, потому что SQL-это лучше для работы с высоко нормализованные данные.
Если вы планируете записать данные в настройки установить во время работы программы, то вам лучше пойти с SQLite. Например, если вы не загрузка конфигурационных данных с другого компьютера, или если вы основываете будущее выполнение программы решения на данных, собранных в предыдущие выполнение программы. Базы данных SQLite реализует очень надежный механизм хранения данных, который крайне сложно повредить, когда у вас есть перебои в подаче электроэнергии или программ, которые висят в несогласованном состоянии из-за ошибок. Тленное данных приводит к высоким затратам полевой поддержки, и SQLite будет делать гораздо лучше, чем любое решение или даже популярные библиотеки по XML или YAML.
Проверить мою страницу для получения более подробной информации на базе SQLite.
Я думаю, что единственная важная вещь, это выбрать формат, который вы предпочитаете и можете быстро сориентироваться. XML и JSON и прекрасные форматы конфигов и широко поддерживается--техническая реализация это'т в суть вопроса, по-моему. Это'ы 100% о том, что делает задачу конфигурационными файлами проще для вас.
Я начал использовать JSON, потому что я работаю совсем немного с ним в качестве формата передачи данных, и сериализаторы сделать его легким для загрузки в любую программу развития. Я нахожу в JSON легче читать, чем XML, что делает обработку нескольких сервисов, каждый из которых использует конфигурационный файл, который изменяется довольно часто, что легче для меня!
Насколько я знаю, реестр Windows больше не является предпочтительным способом хранения конфигурации, если вы используете .NET - большинство приложений теперь используют System.Configuration [1, 2]. Поскольку он также основан на XML, кажется, что все движется в направлении использования XML для конфигурации.
Если вы хотите сохранить кросс-платформенность, я бы сказал, что лучше всего использовать какой-нибудь текстовый файл. Что касается форматирования этого файла, то вам стоит принять во внимание, будет ли человек работать с ним или нет. XML кажется немного более дружелюбным к ручным манипуляциям, чем INI-файлы, из-за видимой структуры файла.
Что касается налога на угловые скобки - я не беспокоюсь об этом слишком часто, поскольку библиотеки XML заботятся о его абстрагировании. Единственный случай, когда это может стать поводом для беспокойства, - это если у вас очень мало места для хранения данных и каждый байт на счету.
[1] Пространство имен System.Configuration - http://msdn.microsoft.com/en-us/library/system.configuration.aspx
[2] Использование файлов конфигурации приложений в .NET - http://www.developer.com/net/net/article.php/3396111
Мы используем файлы свойства, просто потому, что Java поддерживает их изначально. Пару месяцев назад я увидел, что платформа приложений SpringSource использует JSON, чтобы настроить свои сервера, и это выглядит очень интересно. Я сравнил различные обозначения конфигурации]1 и пришли к выводу, что XML-видимому, лучше всего подходят в данный момент. У него есть хорошие инструменты поддержки и достаточно независимым от платформы.
Ре: epatel'ы комментарий
Я думаю, что исходный вопрос был просьбой о конфигурации приложения, что админ будет делать, а не просто сохранение предпочтений пользователя. Предложения, которые вы дали, кажется, больше для пользователей, чем префов конфигурации приложения, и они'т, как правило, то, что пользователь будет когда-либо иметь дело с напрямую (приложение должно обеспечивать параметры конфигурации в пользовательском интерфейсе, а затем обновить файлы). Я действительно надеюсь, что вы'd никогда не сделать пользователь для просмотра/редактирования реестра. :)
Что же касается собственно вопрос, Я'd не сказать, XML-это, наверное, хорошо, как много людей будут использованы для использования, что для конфигурации. Как долго, как вы организуете значения конфигурации в простой в использовании образом, затем в "угол налоговый кронштейн" не должны'т быть слишком плохо.
Может быть, немного по касательной, но вот мое мнение, что конфигурационный файл должен быть прочитан в ключевой словарь значение хэш-таблице, когда приложение запускается в первый раз и всегда доступны через этот объект за скорость. Как правило, ключ/таблица значений начинается как в строку, но вспомогательные функции в объект делать такие вещи, GetConfigDate Датавремя(строковый ключ) и т. д...
На какой платформе вы работаете? Я'бы рекомендовал попробовать использовать предпочтительный/обычный метод для нее.