From bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9 Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Mon, 2 Feb 2026 00:35:54 +0300 Subject: =?UTF-8?q?=D0=91=D0=BE=D0=BB=D1=8C=D1=88=D0=B0=D1=8F=20=D1=87?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20=D0=B1=D0=BB=D0=BE=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/posts/2021-02-13-jsonnet/index.md | 94 +++++++++++++++++++++ content/posts/2021-02-13-jsonnet/jsonnet_logo.webp | Bin 0 -> 47006 bytes 2 files changed, 94 insertions(+) create mode 100644 content/posts/2021-02-13-jsonnet/index.md create mode 100644 content/posts/2021-02-13-jsonnet/jsonnet_logo.webp (limited to 'content/posts/2021-02-13-jsonnet') diff --git a/content/posts/2021-02-13-jsonnet/index.md b/content/posts/2021-02-13-jsonnet/index.md new file mode 100644 index 0000000..4018d46 --- /dev/null +++ b/content/posts/2021-02-13-jsonnet/index.md @@ -0,0 +1,94 @@ +--- +date: "2021-02-13T22:08:19Z" +image: /posts/2021-02-13-jsonnet/jsonnet_logo.webp +tags: + - go + - it + - разное +categories: + - Без рубрики +title: Jsonnet +--- + +Редко такое бывает, что случайно натыкаешься на какую-то технологию и она +вызывает вау-эффект и буквально переворачивает всё верх дном. На днях для меня +такой технологией стал [Jsonnet](https://jsonnet.org/) от Google. + +![Jsonnet](/posts/2021-02-13-jsonnet/jsonnet_logo.webp) + +В кратце, это надмножество 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 системы: + +```jsonnet +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 на новом сервере. Почему бы и нет?:) + +Не знаю смог ли передать ощущение своего восторга, но я охренеть как рад и жду выходных, чтобы с головой нырнуть в эту технологию, которая открывает столько новых интересных перспектив! diff --git a/content/posts/2021-02-13-jsonnet/jsonnet_logo.webp b/content/posts/2021-02-13-jsonnet/jsonnet_logo.webp new file mode 100644 index 0000000..45c63a6 Binary files /dev/null and b/content/posts/2021-02-13-jsonnet/jsonnet_logo.webp differ -- cgit v1.2.3