Контекст
У меня в проекте два модуля:
- Модуль Java / Kotlin
common
- Модуль Android / Kotlin
app
common
зависит от Koin, библиотеки Kotlin для внедрения зависимостей:
dependencies {
implementation 'org.koin:koin-core:1.0.2'
}
Пример использования:
class MyPresenter: KoinComponent {
...
}
app
не зависит от библиотеки Koin, потому что мне не нужно ничего вводить в код Android, все инъекции находятся в общем коде (презентаторы, перехватчики и т. Д.).
Но app
зависит от common
:
dependencies {
implementation project(':common')
}
Пример использования:
class MyFragment {
private val presenter = MyPresenter()
}
Проблема
Я могу скомпилировать common
, я могу запускать модульные тесты в common
, но когда я пытаюсь скомпилировать app
, я получаю эту ошибку:
Супертипы следующих классов не могут быть разрешены. Убедитесь, что у вас есть необходимые зависимости в пути к классам: class xxx.common.presenter.MyPresenter, неразрешенные супертипы: org.koin.standalone.KoinComponent
Когда я бегу ./gradlew :app:dependencies
debugCompileClasspath
+--- project :common
debugRuntimeClasspath
+--- project :common
| +--- org.koin:koin-core:1.0.2
Зависимость находится в конфигурации runtime
, но отсутствует в конфигурации compile
.
Что я пробовал до сих пор:
Очевидно, я не хочу объявлять зависимость от Koin в app
, поэтому я попробовал несколько вещей:
Измените зависимость Koin для api
:
dependencies {
api 'org.koin:koin-core:1.0.2'
}
Не работает - я получаю то же дерево зависимостей, что и implementation
.
Изменить конфигурацию зависимости проекта:
dependencies {
implementation project(path: ':common', configuration: `compile`)
}
Не работает - я не был уверен в этом, но надеялся, что он получит зависимости common
в compile
конфигурации.
Измените зависимость Koin для compile
:
dependencies {
compile 'org.koin:koin-core:1.0.2'
}
Работает! Зависимость отображается в debugCompileClasspath
, и я могу запустить app
.
Вопросов
Теперь я в замешательстве:
- Поскольку
app
не использует Koin напрямую, я, хотя и не нуждался в зависимости. Почему это? Это потому, что статический типMyPresenter
равенKoinComponent
? - Я думал, что
api
то же самое, что устаревшееcompile
. Вроде нет. - Есть ли другой способ, кроме использования устаревшего
compile
?