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.md | |
| 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.md')
| -rw-r--r-- | content/posts/2021-02-13-jsonnet.md | 92 |
1 files changed, 0 insertions, 92 deletions
diff --git a/content/posts/2021-02-13-jsonnet.md b/content/posts/2021-02-13-jsonnet.md deleted file mode 100644 index 9b03e5d..0000000 --- a/content/posts/2021-02-13-jsonnet.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -date: "2021-02-13T22:08:19Z" -image: files/2021-02-13-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 на новом сервере. Почему бы и нет?:) - -Не знаю смог ли передать ощущение своего восторга, но я охренеть как рад и жду выходных, чтобы с головой нырнуть в эту технологию, которая открывает столько новых интересных перспектив! |
