5

语境

我的项目中有两个模块:

  • 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`)
}

不工作- 我不确定这个,但我希望它会获得配置中的依赖commoncompile

更改 Koin 依赖项compile

dependencies {
  compile 'org.koin:koin-core:1.0.2'
}

在职的!依赖项出现在 中debugCompileClasspath,我可以运行app.


问题

现在我很困惑:

  • 由于app不直接使用 Koin,我虽然不需要依赖。为什么会这样?是因为是静态类型MyPresenterKoinComponent
  • 我认为api与 deprecated 相同compile。似乎没有。
  • 除了使用 deprecated 之外,还有其他方法compile吗?
4

1 回答 1

1
  • 因为你让 Koin 类型出现在 common 的 API 中,所以 common 的消费者需要了解 Koin 类型。它们有效地成为 API。
  • api配置是您应该使用并且应该工作的配置
  • 最可能的解释是,一方面的 Android/Kotlin 项目和另一方面的 Java/Kotlin 项目对什么是、如何构建或访问可api消耗配置或...有不同的定义。apiElements

为了调试它,我建议创建一个简单的项目来重现问题并且可以共享,因为 android 或 kotlin 插件中可能存在错误。

于 2019-01-30T17:31:34.073 回答