https://pantsbuild.org/ logo
#development
Title
# development
h

hundreds-father-404

05/20/2020, 11:46 PM
I’m starting to look at adding support for a) codegen to synthetically inject runtime dependencies, and b) “dependency inference” (meaning you can leave off
dependencies
in your BUILD file and Pants will do the right thing based on import statements) -- We need to convert
Dependencies
from a
PrimitiveField
to
AsyncField
so that the engine can do its magic. Call sites would look like:
Copy code
await Get[Addresses](DependenciesRequest(tgt.get(Dependencies))
This means we have one rule to go from
DependenciesRequest -> Addresses
, just like we have one rule to go from
HydrateSourcesRequest -> HydratedSources
. Fine and good. -- The challenge is with codegen dependency injection. Specifically, that that injection will need to access subsystem options, e.g.
--protoc-runtime-targets
. It will need a
SubsystemRule
. But, we can’t have our generic
DependenciesRequest -> Addresses
rule request that subsystem because it has no idea it’s needed. Instead, in the rule, we need a way to say something like “If there are any injected dependencies for this
Dependencies
field, run the rule to inject those.” This is unions, right? Something like:
Copy code
injected_deps = await Get[InjectedDependencies](InjectDependenciesRequest, dependencies_field)
And then the Protoc backend would define a rule that goes from
(ProtocDependencies, Protoc) -> InjectedDependencies
, where
ProtocDependencies
belongs to the union?