5

環境

私のプロジェクトには 2 つのモジュールがあります。

  • Java/Kotlin モジュールcommon
  • Android/Kotlin モジュールapp

common依存性注入のための Kotlin ライブラリである Koin に依存します

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

使用例:

class MyPresenter: KoinComponent {
  ...
}

appAndroid コードに何も注入する必要がないため、Koin ライブラリに依存しません。すべての注入は共通コード (プレゼンター、インターセプターなど) 内にあります。

しかし、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


質問

今私は混乱しています:

  • Koinappは直接使用しないので、依存関係は必要ないと思います。なぜですか?の静的型が でMyPresenterあるからKoinComponentですか?
  • apideprecated と同じだと思いました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 に答える