https://github.com/google/dagger/issues/970

https://github.com/google/dagger/releases/tag/dagger-2.29.1

Dagger 2.29からvalidateTransitiveComponentDependencies オプションが実装されたので、それの使い方の説明。

ここのサンプルでは、Dagger 2.29.1を使っています。

設定の方法

kaptを使っている場合は、次のようにトップのbuild.gradleに指定します

allprojects {
  tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kapt {
      javacOptions {
        option("-Adagger.validateTransitiveComponentDependencies=DISABLED")
      }
    }
  }
}

出来るようになったこと

(app → lib1 → lib2 をimplementationで依存を指定しています。)

上記オプションを指定することで、次のように書くことが出来るようになりました。

例1

// appモジュール
@Component(
  dependencies = [Lib1Component::class]
)
interface AppComponent

// lib1モジュール
@Component
interface Lib1Component {
  fun lib1(): Lib1
}

class Lib1 @Inject constructor(
   private val lib2: Lib2
)

// lib2モジュール
class Lib2 @Inject constructor()

今までだと、appモジュールからLib2クラスを直接参照できなかったため、エラーになっていたのが、エラーが出なくなりました😁

例2