diff options
Diffstat (limited to 'content/posts/2021-02-13-jsonnet.md')
| -rw-r--r-- | content/posts/2021-02-13-jsonnet.md | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/content/posts/2021-02-13-jsonnet.md b/content/posts/2021-02-13-jsonnet.md new file mode 100644 index 0000000..e4ea27e --- /dev/null +++ b/content/posts/2021-02-13-jsonnet.md @@ -0,0 +1,101 @@ +--- +categories: +- Без рубрики +date: '2021-02-13T22:08:19Z' +image: files/2021-02-13-jsonnet_logo.webp +tags: +- go +- it +- разное +title: Jsonnet +--- + +Редко такое бывает, что случайно натыкаешься на какую-то технологию и она +вызывает вау-эффект и буквально переворачивает всё верх дном. На днях для меня +такой технологией стал [Jsonnet](https://jsonnet.org/) от Google. + +В кратце, это надмножество JSON являющееся языком описания шаблонов. Пока звучит +не очень круто, да? На деле это офигенный Тьюринг полный функциональный язык, +результатом выполнения которого будет сформированый JSON (и не только) +документ(или несколько документов[^1]). +[^1]:https://jsonnet.org/learning/getting_started.html#multi + +Если интересно, рекомендую сразу переходить к туториалу — +https://jsonnet.org/learning/tutorial.html. + +## Почему же это круто? + +Ну, во-первых, он реально мощный и простой. С его помощью можно формировать +документы любой сложности. + +Во-вторых, его можно встроить в свою программу на Go (и не только, но на Go — +проще всего — https://jsonnet.org/ref/bindings.html), и это даст бесплатно +мощный DSL для написания очень гибких конфигов. + +В третьих, ну камон, приятно же когда компьютер берет на себя рутинную работу по +формированию больших и сложных JSON’ов! + +## Пример + +Накидал простенький пример который формирует конфигурацию пайплайна для +гипотетической CI системы: + +```json +local map(arr, predicate) = // определяем функцию map +if std.length(arr) == 0 then + [] + else + [ + predicate(arr[0]) + ] + map(arr[1:], predicate); // функциональненько! +local tasks = [['go1.14', '1.14-alpine'],['go1.15', '1.15-alpine'],['go1.16-RC', '1.16-rc-alpine']]; +local commands = ['go build', 'go test']; // Общая часть +{ // Результирующий JSON + pipeline: map(tasks, function (task) { // Вызов map от tasks + name: task[0], + image: "golang:"+task[1], + commands: commands, + }) +} +``` + +Результат: + +```json +{ + "pipeline": [ + { + "commands": [ + "go build", + "go test" + ], + "image": "golang:1.14-alpine", + "name": "go1.14" + }, + { + "commands": [ + "go build", + "go test" + ], + "image": "golang:1.15-alpine", + "name": "go1.15" + }, + { + "commands": [ + "go build", + "go test" + ], + "image": "golang:1.16-rc-alpine", + "name": "go1.16-RC" + } + ] +} +``` + +Круть же! + +Да, на небольшом примере не очень показательно, но даже тут, скажем, при добавлении новой цели сборки будет достаточно слегка подправить массив tasks и автоматически сформируется все остальное, а не копипаст целой секции и ручная правка в нужных местах. + +Я оставил за скобками то, что этот шаблонизатора позволяет формировать не только JSON но и фактически любой другой текстовый формат. И даже из одного скрипта формировать несколько документов разного формата. При этом локальные переменные будут использоваться общие. Теоретически, если упороться, можно одним скриптом сформировать весь /etc на новом сервере. Почему бы и нет?:) + +Не знаю смог ли передать ощущение своего восторга, но я охренеть как рад и жду выходных, чтобы с головой нырнуть в эту технологию, которая открывает столько новых интересных перспектив!
\ No newline at end of file |
