Зависимость Gradle не используется совместно с зависимым модулем - PullRequest
0 голосов
/ 30 января 2019

Контекст

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

  • Модуль 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, я получаю эту ошибку:

Не удается разрешить супертипы следующих классов.Убедитесь, что у вас есть необходимые зависимости в classpath: 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.


Questions

Теперь я в замешательстве:

  • Поскольку app не использует Koin напрямую, я, хотя и не нуждаюсь в зависимости.Почему это?Это потому, что статический тип MyPresenter равен KoinComponent?
  • Я думал, что api был таким же, как устаревший compile.Кажется, нет.
  • Есть ли другой способ, кроме использования устаревшего compile?

1 Ответ

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

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

...