Gradle依赖项未与依赖模块共享

时间:2019-01-30 14:44:34

标签: android gradle koin

上下文

我的项目中有两个模块:

  • 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时,会出现此错误:

  

以下类的超类型无法解析。请做出来   确保您在类路径中具有必需的依赖项:       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配置中丢失。


到目前为止我已经尝试过:

很显然,我不想在app中声明Koin依赖关系,所以我尝试了以下几种方法:

更改api的Koin依赖项:

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

不起作用-我得到的依赖树与implementation完全相同。

更改项目依赖项配置:

dependencies {
  implementation project(path: ':common', configuration: `compile`)
}

无法正常工作-我不确定这一点,但我希望它能在common配置中获得compile的依赖性。

更改compile的Koin依赖项:

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

正在工作!依存关系出现在debugCompileClasspath中,并且我能够运行app


问题

现在我很困惑:

  • 由于app并不直接使用Koin,所以我虽然不需要依赖。为什么呢是因为MyPresenter的静态类型是KoinComponent吗?
  • 我认为api与弃用的compile相同。好像没有。
  • 除了使用已弃用的compile之外,还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

  • 由于您要让Koin类型出现在通用API中,所以通用消费者需要了解Koin类型。它们有效地成为了API。
  • ORDER BY HierachyLevel DESC配置是您应该使用并且应该可以使用的
  • 最可能的解释是,在一侧的Android / Kotlin项目与另一侧的Java / Kotlin项目之间,api是什么,消耗性配置api的定义不同。已建立或访问或...

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

相关问题