Зависимость Gradle не используется зависимым модулем

Контекст

У меня в проекте два модуля:

  • Модуль 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?

person Tijee    schedule 30.01.2019    source источник


Ответы (1)


  • Поскольку вы делаете так, чтобы типы Koin появлялись в общих API-интерфейсах, обычные потребители должны знать о типах Koin. Они фактически становятся API.
  • Конфигурация api - это то, что вам следует использовать и должно работать
  • Наиболее вероятное объяснение состоит в том, что между проектом Android / Kotlin с одной стороны и проектом Java / Kotlin с другой стороны есть разные определения того, что такое api, как строится или используется конфигурация расходных материалов apiElements или ...

Чтобы отладить это, я бы рекомендовал создать простой проект, который воспроизводит проблему и которым можно поделиться, поскольку в плагине android или kotlin может быть ошибка.

person Louis Jacomet    schedule 30.01.2019