Skip to content

Migra Koin de KSP Annotations para o Koin Compiler Plugin - #100

Merged
gabrielbmoro merged 1 commit into
masterfrom
gmoro/koin-compiler-plugin
Nov 7, 2026
Merged

gabrielbmoro merged 1 commit into
masterfrom
gmoro/koin-compiler-plugin

Conversation

@gabrielbmoro

Copy link
Copy Markdown
Collaborator

Contexto

O grafo era declarado com koin-annotations 2.3.1 + koin-ksp-compiler via o convention plugin com.streamplayer.koin-annotations-setup (KSP, kspCommonMainMetadata, srcDir do código gerado e o workaround de dependsOn("kspCommonMainKotlinMetadata")). Este PR troca a geração por compilação: Koin Compiler Plugin 1.2.3 com Koin 4.2.2, sem KSP para o Koin.

O que muda

Gradle

  • Koin 4.2.0 -> 4.2.2; Compiler Plugin 1.2.3 aplicado no com.streamplayer.kmp-library (todos os módulos KMP) e no androidApp, com compileSafety = true.
  • com.streamplayer.koin-annotations-setup fica só com os artefatos do Koin: sai o plugin KSP, o kspCommonMainMetadata, o srcDir gerado, o dependsOn e o KOIN_CONFIG_CHECK (34 linhas -> 3).
  • KSP permanece apenas no core-local-storage (Room). Removido do core-background-work, que aplicava o plugin sem nenhum processor.

Código

  • @KoinApplication object KoinApp + startKoin<KoinApp> (org.koin.plugin.module.dsl) substituem os NetworkModule().module / SearchModule().module gerados pelo KSP.
  • Os 4 módulos anotados (NetworkModule, SearchModule, NewsScreenModule, ProfilePickerStreamModule) passam a ser raízes de descoberta @Configuration.
  • @KoinViewModel -> org.koin.core.annotation; @Single -> @Singleton; @Provided removido dos 6 parâmetros (a anotação não existe mais no Koin 4.2 e o KSP gerava get() para eles, então o comportamento é o mesmo).
  • Os módulos em DSL (ListStreamModule, DetailStreamModule, LocalStorageModule, SyncModule, PermissionsModule, coreSessionModule) não foram reescritos: continuam em DSL e agora são checados pelo plugin.

Um ajuste de comportamento

  • PermissionsModule: lazyModule -> module. A checagem de grafo não segue lazyModules e reportava KOIN-D001 para PermissionsManager. A criação da instância continua sob demanda (corpo do single { }), só o registro do módulo passou a ser no start.

Por que sem koin-bom

platform(Any) está como DeprecationLevel.ERROR no Kotlin DSL do Gradle 9.3 dentro dos scripts precompilados do build-logic (não é suprimível). Os artefatos do Koin são resolvidos pela mesma chave koin do libs.versions.toml, o que mantém o alinhamento.

Validação

  • ./gradlew :androidApp:assembleDebug OK
  • ./gradlew testDebugUnitTest OK
  • ./gradlew :composeApp:compileKotlinIosSimulatorArm64 OK (target nativo)
  • ./gradlew detekt OK (mesmo comando do CI)
  • Compile safety comprovada: a checagem pegou um KOIN-D001 real durante a migração (antes do ajuste do PermissionsModule), ou seja, ela roda de verdade em startKoin<KoinApp>.
  • Runtime no emulador (app instalado com a mudança): Home (ListStreamViewModel + sessão + DAO do Room), Detail (parametersOf(id) + rememberKoinModules), Search (lista padrão e busca digitada, exercitando os 8 @Factory), News (fluxo de permissão -> PermissionsManager) e Profile picker (4 @Factory + ViewModel). Nenhuma exceção do Koin no logcat.

Como testar

./gradlew :androidApp:installDebug

Abrir Início -> um título (Detail) -> busca -> Novidades (permitir/negar permissão) -> avatar (Profile picker).

Follow-ups (fora do escopo)

  • Módulos DSL continuam em DSL; converter para single<T>() / factory<T>() é uma etapa de estilo opcional.
  • core-permission/.../di/PermissionsModule.kt não tem declaração de package (pré-existente).
  • core-session aplica o convention plugin de annotations sem ter nenhuma anotação.

Kotzilla

A sessão foi capturada no emulador depois da migração; não houve baseline em 4.2.0 e o MCP não estava conectado nesta sessão, então tempos de vida/instâncias não foram comparados com o antes.

- Koin 4.2.0 -> 4.2.2; koin-ksp-compiler removed, Compiler Plugin 1.2.3
  applied by com.streamplayer.kmp-library (KSP kept only for Room in
  core-local-storage)
- @KoinApplication KoinApp + startKoin<KoinApp> replace the KSP-generated
  `AppModule().module` call sites; the four annotated modules become
  @configuration discovery roots
- @KoinViewModel moves to org.koin.core.annotation; @provided dropped
  (gone in Koin 4.2, KSP had generated plain get() for those parameters)
- PermissionsModule: lazyModule -> module so the full-graph check sees
  PermissionsManager (lazyModules is not followed by compile safety)
- compile-safety at startKoin replaces KSP's KOIN_CONFIG_CHECK
@gabrielbmoro
gabrielbmoro requested a review from a team as a code owner November 7, 2026 00:21
@gabrielbmoro
gabrielbmoro merged commit f458717 into master Nov 7, 2026
4 checks passed
@gabrielbmoro
gabrielbmoro deleted the gmoro/koin-compiler-plugin branch November 7, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants