LINUX.ORG.RU

Ищу формат для древовидных/иерархических конфигов

 , ,


0

7

Собственно понадобились древовидных/иерархических конфиги для написания людьми. Такой себе DSL. Человек пишет декларативный конфиг - прога его обрабатывает и выдаёт результат.

Требования:

  1. Минимальное количество синтаксического шума.
  2. Коментарии.
  3. Многострочный текст.
  4. Иерархичность.
  5. Популярный формат, чтобы либа была для любого языка.

Что имеем:

  • YAML

    Самый очевидный выбор. Но провозившись с ним неделю - я возненавидел его. Он до безобразия переусложнён и не очевиден. Я до сих пор не могу предугадать как мой конфиг будет распарсен - это провал. Я даже пытался написать простенький парсер, чтобы лучше понять его. Но только больше запутался.

  • XML

    Тот случай, когда дедушка XML подходит лучше всего. Но хотелось бы что-то более простое.

  • JSON

    Не подходит по всем параметрам. Не для людей.

  • JSON5

    Ближе всего к идеалу, но малораспространён.

  • TOML

    Всем хорош, но не древовидный (да, если костыль, но это тихий ужас).

Есть идеи?

PS: шутки про s-expressions не интересны

★★★★★

Ответ на: комментарий от RazrFalcon

Если людям надо сотни конфигов писать, хоть на питоне им конфигурашку слепи, не издевайся над пользователями.

peregrine ★★★★★
()
Ответ на: комментарий от stasolog

И? Там пример кода. Код на ЛОР'е колоризуется жс-либой хайлайт.жс. Сам движок ЛОР'а только впиливает результат в страницу.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Я знаю кто раскрашивает код, но флакон сказал что лор, я так и продолжил писать...

stasolog
()

Можно попробовать Vili, если не пугает его не высокая распространённость, формат именно древовидный и очень простой.

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 1)

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

snizovtsev ★★★★★
()
Ответ на: комментарий от RazrFalcon

Можно ещё взять Lua ?

  • иерархия - вложенными таблицами,
  • комменты,
  • многострочный текст
  • синтаксический шум на совести разработчка
  • кроссплатформенность на чистом Си
AKonia ★★
()
Ответ на: комментарий от AKonia

на чистом Си

triggered

А так вариант действительно хороший, lua часто для конфигов юзают, ну и он намного быстрее python'a.

stasolog
()
Ответ на: комментарий от stasolog

Чем триггернуло то, разрабы заявляли, что позаботились о том, что там даже есть возможность сборки строго под Си89, по умолчанию Си99, плюс там такие вкусные PEG регулярки можно крутить.

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 1)

до сих пор не могу предугадать как мой конфиг будет распарсен

Аналогично. Но выбора нет, смирись.

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

WitcherGeralt ★★
()
Ответ на: комментарий от RazrFalcon

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

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

Берите тогда любой из списка. Хотя конечно конфиги по 10мб это очень много, это уже по сути не конфиг в его общеупотребимом понимании, а что-то типа плейнтекст дата стор, пусть даже данные и являются по сути конфигурационными. + я так понял вы еще и подумываете внести некоторую степень условного выполнения этих файлов настройки через содержимое в них, т.е. написать парсер так чтобы он поддерживал инструкции условного выполнения прямо на основе содержимого такого конфига если я правильно вас понимаю, видимо вам и правда проще тогда окалечить какой-нибудь интерпретатор написав к нему фасад и ограничив его возможности только тем что нужно вам и пусть себе ваши конечные пользователи пишут на каком-то диалекте того же lua или что вы выберете для себя.

abcq ★★
()
Ответ на: комментарий от RazrFalcon

Ну, основная для нас фишка HOCON-а — это оверрайты. То есть, есть один общий конфиг, а есть маленькие оверрайты для девелопмента, для продакшена, для тестового сервера, и т.п. Так что не JSON.

За JSON5 спасибо, я не знал об этой штуке.

Miguel ★★★★★
()

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

Anoxemian ★★★★★
()
Ответ на: комментарий от WitcherGeralt

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

Anoxemian ★★★★★
()
Ответ на: комментарий от RazrFalcon

дак храни, кто мешает. зато 100% валидно будешь это делать

да и проще таскать 1 блоб, и разворачивать это все просто. вобщем работы больше, но потом профиты очевидны

Anoxemian ★★★★★
()
Последнее исправление: Anoxemian (всего исправлений: 1)
Ответ на: комментарий от peregrine

Ну это скорее сорцы, чем конфиг. Обычно там будет строк 200, но в теории размер не ограничен и нужно его очень быстро переваривать.

Фактически это будет аналог fonttools.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

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

https://hackage.haskell.org/package/yaml на примере напишите свой.

Vault_Boy
()
Ответ на: комментарий от RazrFalcon

ИМХО всё-таки повторюсь Lua в подобных случаях - оптимальный вариант дающий и широкий простор и удовлетворяющий всем указанным требованиям. К тому же при желании легко прикрутить проверки на допустимость считанных данных.

AKonia ★★
()

Плюсую за LUA. Вроде бы во все нужные требования более-менее ложится.

SkyMaverick ★★★★★
()

Популярный формат

Всё три популярных не предлагать

Проигнорирую взаимоисключающие параграфы и предложу dhall.

t184256 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Тру-декларативный, для конфига самое то.

t184256 ★★★★★
()
Ответ на: комментарий от abcq

конфиги по 10мб

В XML, кстати, можно инклюдинг замутить. Раздробить на сегменты и будет чутка удобнее.

deep-purple ★★★★★
()
Ответ на: комментарий от alpha

Капец ты упорная. Никогда не надоест очевидные вещи отрицать?

Закон Мёрфи знаешь? Если юзер может ошибиться, он обязательно это сделает. В случае упоротого языка и сложного конфига может оказаться довольно проблематично дать такой выхлоп из валидатора, чтобы было понятно где проблема. Отсюда, наверное, и растут корни желания ТСа написать свой парсер.

WitcherGeralt ★★
()

Не знаю что за YAML и TOML, подозреваю что это то лучшее, которое враг хорошего.

По мне так самое оптимальное это XML, там акурат ровно столько чтобы хранить дерево параметров и их значений.

Во всяком случае как пользователь(вобще) я за XML.

А Jpson5 небось не лучше своего предка, хотя и его я тоже не видел.

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 1)

Имхо, набор взаимоисключающих требований. Если бы не пункт про ручную набивку, подошел бы только xml.

eagleivg ★★★★★
()
Ответ на: комментарий от RazrFalcon

Тот случай, когда json самый унылый

Может форматирование всё портит?

// Integer overflow.
[{
  table: "glyf",
  glyphs: [{
    name: "A",
    type: "contours",
    contours: [[
      { x: 32767, y: 0 },
      { x: 65534, y: 0 },
      { x: 98301, y: 0 },
      { x: 131068, y: 0 },
    ]]
  }]
}]

DllMain
()
Ответ на: комментарий от AKonia

Согласен, lua из всего вышеперечисленного наиболее удобен именно как человекоредактируемый конфиг. Конфиги на xml вспоминаю как страшный сон. Yaml задалбывает обязательными отступами, на своей машине когда все настроено, еще ничего, а если надо править конфиг, или его создавать на какой-нибудь винде с блокнотом, проще застрелится.

einhander ★★★★★
()
Ответ на: комментарий от cdshines

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

xml писать руками тоже никто никогда не будет

у json / hocon +- однозначный парсинг, по крайней мере с ошибками проблем не будет.

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

cdshines ★★★★★
()
Ответ на: комментарий от AKonia

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

cdshines ★★★★★
()
Ответ на: комментарий от RazrFalcon

так он не тьюринг-полный, все нормально, не свалишься в def f() = f()

cdshines ★★★★★
()

Тот случай, когда дедушка XML подходит лучше всего. Но хотелось бы что-то более простое.

Так хорошо спроектированный XML очень прост.

XML начинает превращаться в многословное говно, когда разработчик XML-схемы начинает хотеть что-то максимально универсальное и вместо

<widget name="leNick">
        <label>Nickname</label>
</widget>

лепит что-то типа

<component>
    <class>widget</class>
    <property>
        <type>string<type>
        <name>name</name>
        <value>leNick</value>
    <property>
<component>

и так далее на 100 листов. Почему он так делает — понятно, он хочет сделать одну XML-схему на все случаи жизни и не заморачиваться проработкой предметной области. Получается вырвиглазно. Но XML в этом не виноват. Он рассчитан на другое использование.

hobbit ★★★★★
()

Используй markdown, лол.

Всё что не нужно для описания конфига считать комментом.

skyman ★★★
()
Ответ на: комментарий от cdshines

Можно среду порезать, там такое предусмотрено, можно также настроить среду-песочницу, по существу дыру можно встроить куда угодно и при желании дыры можно найти практически везде.

AKonia ★★
()
Ответ на: комментарий от Begemoth

Бери пример с dwm - https://dwm.suckless.org/

You don’t have to learn Lua/sh/ruby or some weird configuration file format (like X resource files), beside C, to customize it for your needs: you only have to learn C

triggered x2

goto-vlad
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.