Реклама
Перетяжка // Коробка 3.0

В Kotlin 2.4.20 команду kotlin переименовали в kotlinr

Kotlin 2.4.20 переименовал команду запуска kotlin в kotlinr, обновил webpack до 5.108.1 и добавил экспериментальный нативный образ компилятора.

Обложка: В Kotlin 2.4.20 команду kotlin переименовали в kotlinr

Если у вас в CI или в скриптах сборки вызывается kotlin, обновление на 2.4.20 их сломает: команду запуска переименовали. JetBrains выпустила Kotlin 2.4.20 — разбираем, что придётся починить и что взамен появилось полезного.

Версия уже входит в свежие сборки IntelliJ IDEA и Android Studio, поэтому обновление часто приезжает вместе с обновлением среды разработки, а не отдельным решением.

Коротко
Что нужно знать

Команда запуска kotlin стала kotlinr: старая печатает предупреждение.

Компилятор получил первый экспериментальный нативный образ с быстрым стартом.

Обновлённый webpack 5.108.1 может сломать сборку Kotlin/JS на CommonJS-файлах.

Цель watchosArm32 объявлена устаревшей и уедет в 2.5.0.

Что сломается после обновления

Главное — переименование раннера. Команда kotlin конфликтовала с одноимённой командой из Kotlin Toolchain, поэтому запуск скомпилированного кода переехал на новое имя:

			# было
kotlin MyAppKt

# стало
kotlinr MyAppKt
		

Старое имя пока работает и печатает предупреждение с рекомендацией перейти на новое. Но полагаться на это не стоит: предупреждение обычно предшествует удалению.

Второй источник поломок — фронтенд. В 2.4.20 подтянули webpack 5.108.1, и он перестал игнорировать import.meta при определении типа модуля. Файл с этой конструкцией теперь считается ES-модулем, и если в нём же есть конструкции CommonJS, сборка падает. Для Kotlin/JS помогает переключение цели на ES-модули через useEsModules() в Gradle DSL.

  • встроенный минификатор webpack переехал с terser-webpack-plugin на общий пакет, и проекты, которые настраивали его напрямую, придётся поправить;
  • цель watchosArm32 устарела вслед за отказом Apple от 32-битных watchOS и будет удалена в Kotlin 2.5.0 ради совместимости с Xcode 27;
  • компилятор Kotlin/Native запретил атомарные операции AtomicFU внутри публичных inline-функций.

Что появилось полезного

Компилятор впервые получил нативный образ. Это замена командной строке kotlinc с более быстрым стартом, пока в статусе экспериментальной. В образ уже вшиты плагины сериализации, Compose, Lombok и power-assert, так что подключать их отдельно не нужно.

В стандартную библиотеку добавили интерфейс StackTraceRecoverable. Он нужен для отладки корутин: когда одна корутина бросает исключение, а другая его перебрасывает, библиотека восстанавливает стек, создавая новый экземпляр исключения. Раньше это работало автоматически только для исключений с простыми конструкторами. Если у вашего исключения есть обязательные аргументы вроде кода ошибки, теперь можно описать копирование самому.

Появились и функции проверки коллекций: allDistinct() отвечает, все ли элементы уникальны, а allEqual() — все ли равны. До этого такие проверки писали через неочевидные обходные конструкции. Обе пока экспериментальные.

Как обновиться

Обновите среду разработки до свежей версии и поменяйте версию Kotlin в скриптах сборки. Если нужен компилятор командной строки, его забирают со страницы релиза на GitHub.

			plugins {
    kotlin("jvm") version "2.4.20"
}
		
Частые вопросы
1
Обязательно ли сразу переходить на kotlinr?

Нет, старая команда работает и предупреждает. Но правку в CI лучше внести сразу, пока она не превратилась в аварию на релизе.

2
Затронет ли обновление webpack Kotlin/Wasm?

В большинстве случаев нет, дополнительная настройка не нужна. Если ошибка про import.meta всё же возникла, ищите эту конструкцию в своих исходниках и в зависимостях.

3
Стоит ли пробовать нативный образ компилятора?

Он экспериментальный, поэтому в продакшен-сборку его нести рано. Но замерить на нём время старта локально имеет смысл: ради этого он и сделан.

Выводы

Релиз небольшой по числу заметных фич, но с двумя правками, которые задевают почти всех: переименование раннера и обновление webpack. Полный перечень изменений собран в документации What is new in Kotlin 2.4.20.

Проверьте, не вызывается ли старая команда в ваших пайплайнах, и заодно посмотрите, не использует ли фронтенд-часть проекта CommonJS вперемешку с ES-модулями.