Kotlin Script
для кого, зачем и как
Обо мне
- Техлид JVM Backend в Банке Центр-инвест
- Пишу на Kotlin больше 5 лет
- Фанат Kotlin
JetBrains Space CI/CD DSL
Live-Plugin
(простые плагины для IDEA)
Позиционирование 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
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
- Типобезопасность на уровне компиляции
Shebang обычный
Shebang для .java
Замена BASH-скриптов в автоматизации задач
Kotlin Script
Скрипты .kts
Скрипты .main.kts
- Подключение репозиториев и библиотек
- Конфигурация комплятора в самом скрипте
- Кэширование между запусками
- Поддержка в IDE "из коробки"
Встраивание скриптового движка в приложение
конфигурация через
"Typesafe DSL"
конфигурация через
"Typesafe DSL"
плагинная архитектура
кастомизация действий пользователем
кастомизация действий пользователем
FIND USER
Основные компоненты скриптинга
Основные компоненты скриптинга
Основные компоненты скриптинга
- Описание скрипта - Script Definition
- Исполнение скрипта - Scripting Host
Script Definition
Конфигурация компиляции
- Зависимости
- Импорты по умолчанию
- Конфигурация IDE
- Параметры компилятора Kotlin
- Доступные в скрипте свойства
- Определение неявных (implicit) ресиверов
Конфигурация компиляции
Пример
Конфигурация компиляции
Пример
PipelineBuilder.kt
example.gitlab-ci.kts
Конфигурация компиляции
Пример
Конфигурация компиляции
Внешние зависимости
Конфигурация компиляции
Внешние зависимости
example.gitlab-ci.kts
Конфигурация исполнения
- Параметры запуска JVM
- Передача созданных экземпляров implicit ресиверов
- Аргументы конструктора для базового класса скрипта
- Возможность разделения инстансов скрипта
- Просмотр истории запусков (для REPL)
- Возможность переопределения любых частей скрипта
Конфигурация исполнения
Пример
Конфигурация исполнения
Пример
Конфигурация хоста
Пример
Конфигурация хоста
Пример
Подсветка в 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
- Упрощает поддержку скриптов
Ссылка на презентацию и полезные штуки