Файлы конфигурации приложения

Итак, я не хочу начинать священную войну здесь, но мы пытаемся консолидировать то, как мы обрабатываем файлы конфигурации наших приложений, и мы изо всех сил пытаемся принять решение о наилучшем подходе. . На данный момент каждое распространяемое нами приложение использует свои собственные специальные файлы конфигурации, будь то файлы свойств (в стиле ini), XML или JSON (на данный момент только для внутреннего использования!).

В настоящее время большая часть нашего кода написана на языке Java, поэтому мы рассмотрели конфигурацию Apache Commons, но мы обнаружили, что это довольно многословно. Мы также рассмотрели XMLBeans, но кажется, что вокруг много пустяков. Я также чувствую, что меня подталкивают к XML как к формату, но мои клиенты и коллеги опасаются пробовать что-то еще. Я могу понять это с точки зрения клиента, все слышали об XML, но, в конце концов, не следует ли использовать правильный инструмент для работы?

Какие форматы и библиотеки люди используют в производственных системах в наши дни, пытается ли кто-нибудь еще избежать угла скобочный налог?

Редактировать: действительно должно быть межплатформенное решение: Linux, Windows, Solaris и т. д., и выбор библиотеки, используемой для взаимодействия с файлами конфигурации, так же важен, как и выбор формата.< /эм>


person ninesided    schedule 15.08.2008    source источник
comment
проголосовал за то, что сказал, что XMLBeans кажется большим количеством безделья   -  person Cheeso    schedule 19.05.2009


Ответы (15)


XML XML XML XML. Мы говорим об файлах конфигурации. Не существует «налога на угловые скобки», если вы не сериализуете объекты в ситуации с высокой производительностью.

Файлы конфигурации должны быть удобочитаемы и понятны человеку, в дополнение к машиночитаемости. XML является хорошим компромиссом между ними.

Если в вашем магазине есть люди, которые боятся этой новомодной технологии XML, мне вас жаль.

person Community    schedule 15.08.2008
comment
Не уверен, что это сарказм, но, учитывая, что ответу 9 лет, я думаю, что нет. :) - person Roman K; 20.11.2017
comment
Тогда были другие времена... - person THIS USER NEEDS HELP; 29.03.2018

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

person engtech    schedule 15.08.2008
comment
Куро5хин указал, что строки и символы считаются причинами использования YAML вместо XML. Интересно, почему он забыл указать количество вспомогательных инструментов и библиотек? YAML: 2, XML: 2 000 000. - person Cheeso; 19.05.2009
comment
В Yaml гораздо больше библиотек, чем две. yaml.org - person engtech; 21.01.2011
comment
Мне нравится YAML, и около 12 языков со сторонними библиотеками перечислены на yaml.org. Но единственным языком, который поставляется с поддержкой YAML по умолчанию, является Ruby (начиная с версии 1.9.2). Есть ли другие? Добавление зависимостей может быть проблемой. - person nealmcb; 21.03.2012
comment
Я не уверен, было ли это намерением @cheeso, но я бы увидел, что выбор между двумя библиотеками (а не 2M) является преимуществом, а не недостатком (особенно если они правильно поняли эти две...) - person bacar; 15.05.2012
comment
@Cheeso Если для языка, который я использую, есть одна хорошо написанная библиотека YAML, на самом деле не имеет значения, что для языка, который я использую, существует 11 библиотек XML. Конечно, у вас доходит до одиннадцати. Но когда вы в последний раз использовали две XML-библиотеки в одной программе? (Если ответ на этот вопрос не «никогда», вы можете подумать о другом направлении работы.) - person Parthian Shot; 08.08.2014
comment
YAML? Серьезно? Yaml, на мой взгляд, является худшим вариантом, потому что важно иметь правильное форматирование, поместить на один пробел меньше, и это не сработает. - person darek; 20.01.2017

Во-первых: это действительно большой вопрос для обсуждения, а не быстрый вопрос + ответ.

Сейчас мне больше всего нравится просто включать Lua, потому что

  • Я могу разрешить такие вещи, как ширина = высота * (1 + 1/3)
  • Я могу сделать доступными пользовательские функции
  • Я могу запретить что-нибудь еще. (невозможно, например, в Python (включая соленья).)
  • Я, вероятно, все равно захочу скриптовый язык где-то еще в проекте.

Другой вариант, если данных много, — использовать sqlite3, потому что они правы

  • Маленький.
  • Быстро.
  • Надежный.

Выберите любые три.

К чему я хотел бы добавить:

  • резервные копии - это несложно. (просто скопируйте файл db.)
  • проще переключиться на другую БД, ODBC, что угодно. (чем из fugly-файла)

Но опять же, это большая проблема. «Большой» ответ на это, вероятно, включает в себя какую-то матрицу функций или список ситуаций, таких как:

Объем данных или короткое время выполнения

  • Для больших объемов данных вам может понадобиться эффективное хранилище, например db.
  • Для коротких прогонов (часто) вам может понадобиться что-то, для чего вам не нужно много анализировать, рассмотрите что-то, что можно напрямую mmap:ed.

С чем связана конфигурация?

  • Host:
    • I like YAML in /etc. Is that reimplemented in windows?
  • User:
    • Do you permit users to edit config with text editor?
    • Должен ли он быть централизованно управляемым? Реестр/gconf/удаленная БД?
    • Может ли у пользователя быть несколько разных профилей?
  • Project:
    • File(s) in project directory? (Version control usually follows this model...)

Сложность

  • Есть только несколько плоских значений? Рассмотрим YAML.
  • Являются ли данные вложенными или зависимыми каким-то образом? (Вот тут становится интересно.)
  • Может быть желательной функцией, позволяющей использовать скрипты в той или иной форме?
  • Шаблоны можно рассматривать как своего рода конфигурационные файлы.
person Anders Eurenius    schedule 15.08.2008

Не начав новую священную войну, я главным образом не согласен с Джеффом в отношении поста о налоге на угловые скобки. В XML нет ничего плохого, он достаточно удобочитаем для человека (настолько же, насколько файлы YAML, JSON или INI), но помните, что он предназначен для чтения машинами. Большинство комбинаций язык/фреймворк поставляются с тем или иным бесплатным синтаксическим анализатором XML, что делает XML довольно хорошим выбором.

Кроме того, если вы используете хорошую IDE, такую ​​​​как Visual Studio, и если XML поставляется со схемой, вы можете передать схему VS и волшебным образом получить intellisense (например, вы можете получить ее для NHibernate).

В конечном итоге вам нужно подумать о том, как часто вы будете касаться этих файлов во время работы, возможно, не так часто.

Это по-прежнему говорит мне все о XML и о том, почему он по-прежнему допустим для файлов конфигурации (из Тим Брей):

"Если вы хотите предоставить данные общего назначения, с которыми получатель может захотеть сделать непредвиденные странные и сумасшедшие вещи, или если вы хотите быть действительно параноиком и разборчивым в отношении i18n, или если то, что вы отправляете, больше похоже на документ, чем структура, или если порядок данных имеет значение, или если данные потенциально долгоживущие (например, более секунд), XML - это путь. Мне также кажется, что комбинация XML и XPath идеально подходит для форматов данных, которые должны быть расширяемыми, иными словами, довольно легко написать код обработки XML, который не даст сбой при наличии изменений в формате сообщения, которые не касаются той части, которую вы используете. заботиться о."

person Kev    schedule 15.08.2008
comment
хотел бы я проголосовать за это больше - person Cheeso; 19.05.2009

@Парень

Но конфигурация приложения — это не всегда просто пары ключ/значение. Посмотрите что-то вроде конфигурации 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" />

Вы можете иметь любое количество разъемов. Определите больше в файле, и существует больше соединителей. Больше не определяйте и больше не существуете. Нет хорошего способа (имхо) сделать это с помощью старых простых пар ключ/значение.

Если конфигурация вашего приложения проста, то, вероятно, подойдет что-то простое, например файл INI, который считывается в словарь. Но для чего-то более сложного, такого как конфигурация сервера, INI-файл было бы очень сложно поддерживать, и что-то более структурированное, например XML или YAML, было бы лучше. Все зависит от поставленной задачи.

person Herms    schedule 15.08.2008

Мы используем конфигурационные файлы в стиле ini. Для управления ими мы используем библиотеку Nini. Нини делает его очень простым в использовании. Изначально Nini предназначалась для .NET, но была перенесена на другие платформы с использованием Mono.

person Clint Davis    schedule 15.08.2008
comment
ini не определяется каким-либо стандартом и имеет некоторые ограничения, поскольку он является только хранилищем ключей/значений. - person CharlesB; 12.03.2013

XML, JSON, INI.
У всех них есть свои сильные и слабые стороны.
В контексте приложения я считаю, что важным является уровень абстракции.
Если вы можете выбрать способ структурирования данных, это хорошая золотая середина между удобочитаемостью для человека и тем, как вы хотите получить доступ/абстрагировать данные в коде, вы золотой.

Там, где я работаю, мы в основном используем XML, и я не могу поверить, что файл конфигурации, загруженный в кэш как объекты при первом чтении или после того, как в него была записана информация, а затем абстрагированный от остальной части программы, на самом деле так уж важен. это не ударит ни по ЦП, ни по дисковому пространству.
И это также довольно читабельно, если вы правильно структурируете файл.

И все языки на всех платформах поддерживают XML через довольно распространенные библиотеки.

person Lars Mæhlum    schedule 15.08.2008

@Гермс

На самом деле я имел в виду придерживаться рекомендуемого способа, которым программное обеспечение должно хранить значения конфигурации для любой данной платформы.

То, что вы часто получаете, это также рекомендуемые способы их изменения. Подобно меню конфигурации в программе или панели конфигурации в приложении «системные настройки» (например, для программного обеспечения системных служб). Не позволять конечным пользователям изменять их напрямую через RegEdit или NotePad...

Почему?

  1. Конечные пользователи (=клиенты) привыкли к своим платформам
  2. Система резервного копирования может лучше сохранять «безопасные настройки» и т. д.

@девятисторонний

Что касается « выбора библиотеки », попробуйте связать (статическую ссылку) любую выбранную библиотеку, чтобы снизить риск конфликта версий на компьютерах конечных пользователей.

person epatel    schedule 15.08.2008
comment
Аргумент в пользу этого пути был бы намного сильнее, если бы мы могли найти некоторые библиотеки, которые предлагают унифицированный API для различных форматов файлов конфигурации. - person hippietrail; 05.11.2012

Если ваш конфигурационный файл поддерживает однократную запись и только чтение при загрузке, а ваши данные представляют собой набор пар «имя-значение», лучшим выбором будет тот, который ваш разработчик может заставить работать первым.

Если ваши данные немного сложнее, с вложенностью и т. д., вам, вероятно, лучше использовать YAML, XML или SQLite.

Если вам нужны вложенные данные и/или возможность запрашивать данные конфигурации после загрузки, используйте XML или SQLite. Оба имеют довольно хорошие языки запросов (XPATH и SQL) для структурированных/вложенных данных.

Если ваши данные конфигурации сильно нормализованы (например, 5-я нормальная форма), вам лучше использовать SQLite, потому что SQL лучше подходит для работы с сильно нормализованными данными.

Если вы планируете писать в набор данных конфигурации во время работы программы, то вам лучше использовать SQLite. Например, если вы загружаете данные конфигурации с другого компьютера или если вы основываете будущие решения о выполнении программы на данных, собранных при предыдущем выполнении программы. SQLite реализует очень надежный механизм хранения данных, который чрезвычайно сложно повредить при отключении электроэнергии или программах, которые зависают в несогласованном состоянии из-за ошибок. Поврежденные данные приводят к высоким затратам на поддержку на месте, и SQLite будет работать намного лучше, чем любое собственное решение или даже популярные библиотеки на основе XML или YAML.

Посетите мою страницу для получения дополнительной информации о SQLite.

person Community    schedule 19.05.2009

Насколько мне известно, реестр 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

person rjzii    schedule 15.08.2008

Мы используем файлы свойств просто потому, что Java изначально поддерживает их. Пару месяцев назад я увидел, что SpringSource Application Platform использует JSON для настройки своего сервера, и это выглядит очень интересно. Я сравнил различные нотации конфигурации и пришел к выводу, что XML, по-видимому, быть лучшим на данный момент. Он имеет хорошую поддержку инструментов и довольно независим от платформы.

person dlinsin    schedule 15.08.2008

Re: комментарий epatel

Я думаю, что первоначальный вопрос касался конфигурации приложения, которую будет выполнять администратор, а не только сохранения пользовательских настроек. Предложения, которые вы дали, кажутся больше для пользовательских настроек, чем для конфигурации приложения, и обычно это не то, с чем пользователь когда-либо будет иметь дело напрямую (приложение должно предоставлять параметры конфигурации в пользовательском интерфейсе, а затем обновлять файлы). Я действительно надеюсь, что вы никогда не заставите пользователя просматривать/редактировать реестр. :)

Что касается самого вопроса, я бы сказал, что с XML, вероятно, все в порядке, так как многие люди привыкли использовать его для настройки. Пока вы упорядочиваете значения конфигурации простым в использовании способом, «налог на угловую скобку» не должен быть слишком плохим.

person Herms    schedule 15.08.2008

Может быть, это немного тангенциально, но я считаю, что файл конфигурации должен быть прочитан в словарь/хеш-таблицу значений ключа при первом запуске приложения и с тех пор всегда доступен через этот объект для скорости. Обычно таблица ключ/значение начинается как строка в строку, но вспомогательные функции в объекте делают такие вещи, как DateTime GetConfigDate (строковый ключ) и т. д.

person Community    schedule 15.08.2008

Я думаю, что важно только выбрать формат, который вы предпочитаете и можете быстро ориентироваться. XML и JSON — прекрасные форматы для конфигураций, и они широко поддерживаются — мне кажется, что техническая реализация не является сутью проблемы. Это на 100% то, что облегчает вам задачу с конфигурационными файлами.

Я начал использовать JSON, потому что много работаю с ним как с форматом передачи данных, а сериализаторы упрощают загрузку в любую среду разработки. Я считаю, что JSON легче читать, чем XML, что значительно упрощает работу с несколькими службами, каждая из которых использует файл конфигурации, который довольно часто изменяется!

person AnthonyAlmighty    schedule 13.11.2012

На какой платформе вы работаете? Я бы рекомендовал попробовать использовать для этого предпочтительный/общий метод.

  1. MacOSX — списки
  2. Win32 - Реестр (или здесь есть новый, давно я на нем разрабатывал)
  3. Linux/Unix - ~/.apprc (возможно, имя-значение)
person epatel    schedule 15.08.2008
comment
Вопрос теперь указывает на кроссплатформенность. - person hippietrail; 05.11.2012