From: Sergey Matveev Date: Tue, 12 Nov 2019 13:05:32 +0000 (+0300) Subject: NNCP переехал на Hjson формат конфигов X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=1d492807e6d48a3c5fd29d37970dfdf33e91cbad;p=stargrave-blog.git NNCP переехал на Hjson формат конфигов https://hjson.org/ С самого начала меня YAML напрягал своей сложностью. Соответственно, и сложностью библиотек для работы с ним. Но и читать YAML и понимать дело не простое может быть. Изначально для конфигов какой формат можно использовать из библиотек в Go штатно представляемых? JSON, XML. XML сразу нет, без объяснений. JSON в GoVPN был изначально, да и на работе в паре проектов он так и остался, но очень напрягает в нём отсутствие комментариев и возможность оставлять trailing comma. YAML имеет одну мощную штуку в виде ссылок, где можно меньше делать copy-paste. Теоретически в GoVPN или NNCP это могло бы пригождаться. Но я уверен что все инсталляции достаточно малы чтобы чуть-чуть возможного copy-paste не было бы страшным. Посмотрел на TOML: в целом подходит, относительно прост, но его, как ни крути, но может быть очень сложно интерпретировать человеку: [[foo.bar]] baz = 123 [[foo.bar]] abc = 123 на самом деле будет вот такой структурой: { "foo": { "bar": [ {"baz": 123 }, {"abc": 123 } ] } } плюс само по себе задание словаря в TOML может быть разнесено по файлу. TOML в целом мне нравится: он реально хорошо подходит для конфигурации, относительно прост (существенно проще YAML), имеет достаточно возможностей (в отличии от INI, которого формально то и нет, плюс типов данных мало). Но NNCP-шная конфигурация в нём выглядит по-уродски. И тут я вспомнил про Yggdrasil и dnscrypt проекты, где было что-то типа JSON, но с комментариями и меньшим синтаксическим "мусором" для конфига. Hjson прям то, что надо. Даже diff относительно YAML получается маленьким и всякие "foo: bar\nbar: 123" остаются без изменений. github.com/hjson/hjson-go библиотека достаточно компакта чтобы я её посчитал минималистичной. Более того, она штатно предлагает распаковывать Hjson в структуры через пересериализацию в JSON -- накладно, безусловно, но для конфигов это совершенно несущественно (а ведь Hjson для них только будет использован), зато красиво решена проблема с unmarshal с reflect-ом в структуры. A data format for Humans should be lean and simple. Human !== Developer Human != Developer Human <> Developer Human .NE. Developer Human ne Developer Human /= Developer Human '= Developer Human ~= Developer Human -ne Developer ---