square / anvil

A Kotlin compiler plugin to make dependency injection with Dagger 2 easier.
Apache License 2.0
1.31k stars 82 forks source link

Add option to disable generating dagger factories for specific source sets #718

Open matejdro opened 1 year ago

matejdro commented 1 year ago

We have an use case where we want to use anvil only (with generateDaggerFactories = true) inside main source set of a module. However, inside instrumented tests, we want to run full Dagger to generate components for integration tests (kaptAndroidTest("com.google.dagger:dagger-compiler") dependency declaration).

Anvil does not seem to support this configuration:

  1. If we enable kapt inside tests, Anvil will complain that generateDaggerFactories is enabled and Dagger must not coexist and that generating dagger factories should be disabled
  2. But if we disable generating dagger factories, factories will not get generated in the main source set (that does not contain kapt)

Maybe it would be a good idea to add a per-source-set dagger factory generation toggle instead of one global toggle?

matejdro commented 1 year ago

From what I can see, there is no easy access to source sets from Anvil compiler, since it only includes kotlin compiler API, not Gradle API.

I'm thinking of making PR for this, would having path whitelist instead of source set list be a acceptable workaround?

EDIT: What if compiler receives list of paths as whitelist (CommandLineOptions), but those are generated from the source sets by the anvil Gradle plugin?