diff options
| author | 2026-02-02 00:35:54 +0300 | |
|---|---|---|
| committer | 2026-02-02 00:35:54 +0300 | |
| commit | bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9 (patch) | |
| tree | 27fff9c802dcdd22960bb2e776e58278000d0364 /content/posts/2021-02-13-jsonnet | |
| parent | Поправил шаблон (diff) | |
| download | blog-bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9.tar.gz blog-bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9.tar.bz2 blog-bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9.tar.xz blog-bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9.zip | |
Большая чистка блога
Diffstat (limited to 'content/posts/2021-02-13-jsonnet')
| -rw-r--r-- | content/posts/2021-02-13-jsonnet/index.md | 94 | ||||
| -rw-r--r-- | content/posts/2021-02-13-jsonnet/jsonnet_logo.webp | bin | 0 -> 47006 bytes |
2 files changed, 94 insertions, 0 deletions
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. + + + +В кратце, это надмножество 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 Binary files differnew file mode 100644 index 0000000..45c63a6 --- /dev/null +++ b/content/posts/2021-02-13-jsonnet/jsonnet_logo.webp |
