Миграция на Kotlin multiplatform
Мигрировал проект про статистику пулл-реквестов GitHub с Kotlin/JS на multiplatform. На удивление, сама миграция прошла довольно гладко — немного пошаманить с билд-скриптом, переименовать папочки и готово.
Решил заодно попробовать добавить native-реализацию. Проблем было меньше, чем я ожидал:
actual
/expect
использовал только для тестов: чтобы сделать обертку для запуска корутин и чтобы загрузить ресурсы. Вообще, по-хорошему, обе эти функции должны из коробки идти.- Для работы с файлами в стандартной библиотеке ничего нет. Есть kotlinx-io, но она нормально не завелась из-за проблемы с импортом
AutoClosable
. Ловя флешбеки от качества библиотек Jetbrains, я в итоге использовал Okio. Не могу сказать, что API великолепно, но хотя бы работает. - Называть платформу native — небольшое лукавство. Это скорее POSIX, если судить по поддерживаемым платформам, и это местами откровенно торчит.
- Ktor клиент не смог сам подтянуть из зависимостей себе
HttpClientEngine
и кинул не очень помогающую ошибку. Оказалось, что для native есть несколько реализаций и надо явно указать нужную. Почему нельзя это сделать на этапе компиляции, не ясно. - Больше всего времени потратил на десериализацию JSON (sic!). Предыдущий костыль перестал работать с унылым
ArrayIndexOutOfBoundsException
. Я уже раз в четвертый пытался понять великую задумкуkotlinx.serialization
, даже пробовал сделать изолированный баг-репорт, но ничего толком не вышло. В итоге поменял один костыль на другой: избавился от шаблонных классов и сделал класс-композицию. - Старые проблемы остались по большей части в силе.
- Наконец-то использовал по делу
\r
! Он весьма пригодился для простенького отображения прогресса.
Несмотря на проблемы, в целом получилось норм. Можно улучшить валидацию ввода и добавить альтернативные способы вывода результата, но решил, что там все понятно и не стоит тратить на это время.
Комментарии