Kotlin Script

для кого, зачем и как

Обо мне

  • Техлид JVM Backend в Банке Центр-инвест
  • Пишу на Kotlin больше 5 лет
  • Фанат Kotlin

Примеры использования

build.gradle.kts


                
              

JetBrains Space CI/CD DSL


                
              

Github Workflows Kt


                
              

Простое CLI приложение


                
              

Live-Plugin

(простые плагины для IDEA)


                
              

Презентации с Reveal-Kt


                
              

Позиционирование Kotlin Scripting От JetBrains

KEEP: Kotlin Scripting support

Applications

  • Build scripts (Gradle/Kobalt)
  • Test scripts (Spek)
  • Command-line utilities
  • Routing scripts (ktor)
  • Type-safe configuration files (TeamCity)
  • In-process scripting and REPL for IDE
  • Consoles like IPython/Jupyter Notebook
  • Game scripting engines
  • ...

Обобщим

  • Read-Eval-Print Loop (REPL)
  • замена BASH-скриптов
  • встраивание скриптового движка
  • компиляция скриптов с исходниками

Обобщим

  • Read-Eval-Print Loop (REPL)
  • замена BASH-скриптов
  • встраивание скриптового движка
  • компиляция скриптов с исходниками

Read-Eval-Print Loop (REPL)

Read-Eval-Print Loop (REPL)

  • Читает (парсит)
  • Исполняет
  • Выводит ответ
  • И снова

Read-Eval-Print Loop (REPL)

Зачем он нужен?

Зачем он нужен?

  • Обучение основам
  • Прототипирование
  • Быстрая обратная связь

Read-Eval-Print Loop (REPL)

Альтернативы

Read-Eval-Print Loop (REPL)

JShell


                
              

Read-Eval-Print Loop (REPL)

Groovy Shell


                
              

Read-Eval-Print Loop (REPL)

KScript (REPL mode)


                
              
kscript.kts

                
              

Kotlin REPL

Kotlin SHELL


                
              

IJ IDEA Kotlin REPL


IJ IDEA > Tools > Kotlin > Kotlin REPL (Experimental)

Kotlin для Jupyter Notebook

Kotlin для Jupyter Notebook

Замена BASH-скриптов в автоматизации задач

Зачем заменять BASH?

Зачем заменять BASH?

Bash

                
              
Kotlin

                
              

Зачем заменять BASH?

  • Сложные скрипты на Bash - боль
  • Bash - write-only код
  • Зависимости на Bash?

Почему именно Kotlin Script

  • Богатая экосистема JVM
  • Зависимости не в системе
  • Удобство Kotlin DSL
  • Типобезопасность на уровне компиляции

Альтернативы

Java 11 (JEP 330)


                
              

                
              

Shebang обычный


                
              

Shebang для .java


                
              

Java 22 (JEP 458)


                
              

                
              

                
              

Java 22 (+ JEP 463)


                
              

                
              

                
              

Groovy


                
              

                
              

JBang (java)


                
              

                
              

JBang (Groovy)


                
              

                
              

JBang (Kotlin)


                
              

                
              

KScript


                
              

                
              

Замена BASH-скриптов в автоматизации задач

Kotlin Script

Скрипты .kts


                
              

Скрипты .main.kts

  • Подключение репозиториев и библиотек
  • Конфигурация комплятора в самом скрипте
  • Кэширование между запусками
  • Поддержка в IDE "из коробки"

Скрипты .main.kts


                
              

Скрипты .main.kts


                
              

Встраивание скриптового движка в приложение

Зачем?

конфигурация через

"Typesafe DSL"


                
              

конфигурация через

"Typesafe DSL"


                
              

плагинная архитектура

кастомизация действий пользователем

кастомизация действий пользователем

FIND USER

                
              

Практика

Gitlab-CI.kts


                
              

                
              
.gitlab-ci.yaml

                
              

Основные компоненты скриптинга

Основные компоненты скриптинга

Основные компоненты скриптинга

  • Описание скрипта - Script Definition
  • Исполнение скрипта - Scripting Host

Script Definition

Базовый пример


                
              

Базовый пример


                
              

Базовый пример


                
              

Конфигурация компиляции

Конфигурация компиляции

  • Зависимости
  • Импорты по умолчанию
  • Конфигурация IDE
  • Параметры компилятора Kotlin
  • Доступные в скрипте свойства
  • Определение неявных (implicit) ресиверов

Конфигурация компиляции

Пример


                
              

Конфигурация компиляции

Пример

PipelineBuilder.kt

                
              
example.gitlab-ci.kts

                
              

Конфигурация компиляции

Пример


                
              

Конфигурация компиляции

Внешние зависимости


                
              

Конфигурация компиляции

Внешние зависимости

example.gitlab-ci.kts

                
              

Конфигурация исполнения

Конфигурация исполнения

  • Параметры запуска JVM
  • Передача созданных экземпляров implicit ресиверов
  • Аргументы конструктора для базового класса скрипта
  • Возможность разделения инстансов скрипта
  • Просмотр истории запусков (для REPL)
  • Возможность переопределения любых частей скрипта

Конфигурация исполнения

Пример


                
              

Конфигурация исполнения

Пример


                
              

Конфигурация хоста

Конфигурация хоста

Пример


                
              

Конфигурация хоста

Пример


                
              

Script loader

Script loader


                
              

Подсветка в IDE

Подсветка в IDE

Пустой файл в META-INF/kotlin/script/templates с полным именем класса в названии

Подсветка в IDE

META-INF/kotlin/script/templates/ dev.limebeck.ci.gitlab.scripts.GitlabCiKtScript.classname

Подсветка в IDE

Подсветка в IDE

Подсветка в IDE

Подсветка в IDE

  • Работает только в IntelliJ IDEA / Fleet
  • Нужен проект Gradle/Maven для работы

Java Scripting API

(JSR223)

Абстракция в JVM для исполнения скриптов

Kotlin Script + JSR223

Обертка поверх BasicJvmScriptingHost

Безопасность в Kotlin Script

Безопасность в Kotlin Script

  • Ограничение по модулям JVM
  • Ограничение по доступным классам

Недостатки встраивания

  • Компилятор Kotlin в приложении
  • Поддержка IDE - JetBrains only
  • Мало документации
  • Только на JVM
  • Долгий старт

Преимущества встраивания

  • Нативно для Kotlin
  • Расширяемость
  • Поддержка собственных DSL
  • Поддержка IDE

Резюмируя

Резюмируя

  • REPL - быстрая обратная связь
  • Замена BASH - разработчикам и DevOps
  • Встраивание - гибкая конфигурация

Итого по Kotlin Script

  • Зрелое решение (>6 лет)
  • Развивается
  • Лучше всего - со своим DSL
  • Упрощает поддержку скриптов

Ссылка на презентацию и полезные штуки