The following error was printed when the following...
# general
b
The following error was printed when the following was added to the BUILD file according to the documentation Please let me know if there is a workaround. https://www.pantsbuild.org/docs/protobuf-python#multiple-resolves
BUILD
Copy code
protobuf_sources(
    name="protos",
    python_resolve=parametrize("python-default", "resolve-a")
)
Error
Copy code
InvalidFieldException: Only fields which will be moved to generated targets may be parametrized, so target generator ... (with type protobuf_sources) cannot parametrize the 'python_resolve' field.
l
Which version of pants are you running? If you run
pants help protobuf_sources
do you see the
python_resolve
field in the output?
If the issue persists, you can try modifying https://github.com/pantsbuild/example-codegen to reproduce the problem.
b
version
Copy code
[GLOBAL]
pants_version = "2.17.0"
pants help protobuf_sources
output
Copy code
`protobuf_sources` target
-------------------------

Generate a `protobuf_source` target for each file in the `sources` field.


Activated by pants.backend.codegen.protobuf.python
Valid fields:

dependencies
    type: Iterable[str] | None
    default: None

    Addresses to other targets that this target depends on, e.g. `['helloworld/subdir:lib', 'helloworld/main.py:lib', '3rdparty:reqs#django']`.
    
    This augments any dependencies inferred by Pants, such as by analyzing your imports. Use `pants dependencies` or `pants peek` on this
    target to get the final result.
    
    See <https://www.pantsbuild.org/v2.17/docs/targets> for more about how addresses are formed, including for generated targets. You can also
    run `pants list ::` to find all addresses in your project, or `pants list dir` to find all addresses defined in that directory.
    
    If the target is in the same BUILD file, you can leave off the BUILD file path, e.g. `:tgt` instead of `helloworld/subdir:tgt`. For
    generated first-party addresses, use `./` for the file path, e.g. `./main.py:tgt`; for all other generated targets, use
    `:tgt#generated_name`.
    
    You may exclude dependencies by prefixing with `!`, e.g. `['!helloworld/subdir:lib', '!./sibling.txt']`. Ignores are intended for false
    positives with dependency inference; otherwise, simply leave off the dependency from the BUILD file.

description
    type: str | None
    default: None

    A human-readable description of the target.
    
    Use `pants list --documented ::` to see all targets with descriptions.

grpc
    type: bool
    default: False

    Whether to generate gRPC code or not.

overrides
    type: Dict[Union[str, Tuple[str, ...]], Dict[str, Any]] | None
    default: None

    Override the field values for generated `protobuf_source` targets.
    
    Expects a dictionary of relative file paths and globs to a dictionary for the overrides. You may either use a string for a single path /
    glob, or a string tuple for multiple paths / globs. Each override is a dictionary of field names to the overridden value.
    
    For example:
    
        overrides={
            "foo.proto": {"grpc": True},
            "bar.proto": {"description": "our user model"},
            ("foo.proto", "bar.proto"): {"tags": ["overridden"]},
        }
    
    File paths and globs are relative to the BUILD file's directory. Every overridden file is validated to belong to this target's `sources`
    field.
    
    If you'd like to override a field's value for every `protobuf_source` target generated by this target, change the field directly on this
    target rather than using the `overrides` field.
    
    You can specify the same file name in multiple keys, so long as you don't override the same field more than one time for the file.

python_interpreter_constraints
    type: Iterable[str] | None
    default: None

    The Python interpreters this code is compatible with.
    
    Each element should be written in pip-style format, e.g. `CPython==2.7.*` or `CPython>=3.6,<4`. You can leave off `CPython` as a shorthand,
    e.g. `>=2.7` will be expanded to `CPython>=2.7`.
    
    Specify more than one element to OR the constraints, e.g. `['PyPy==3.7.*', 'CPython==3.7.*']` means either PyPy 3.7 _or_ CPython 3.7.
    
    If the field is not set, it will default to the option `[python].interpreter_constraints`.
    
    See <https://www.pantsbuild.org/v2.17/docs/python-interpreter-compatibility> for how these interpreter constraints are merged with the
    constraints of dependencies.

python_resolve
    type: str | None
    default: None

    The resolve from `[python].resolves` to use.
    
    If not defined, will default to `[python].default_resolve`.
    
    All dependencies must share the same value for their `resolve` field.

python_source_root
    type: str | None
    default: None

    The source root to generate Python sources under.
    
    If unspecified, the source root the `protobuf_sources` is under will be used.

sources
    type: Iterable[str] | None
    default: ('*.proto',)

    A list of files and globs that belong to this target.
    
    Paths are relative to the BUILD file's directory. You can ignore files/globs by prefixing them with `!`.
    
    Example: `sources=['example.proto', 'new_*.proto', '!old_ignore*.proto']`

tags
    type: Iterable[str] | None
    default: None

    Arbitrary strings to describe a target.
    
    For example, you may tag some test targets with 'integration_test' so that you could run `pants --tag='integration_test' test ::` to only
    run on targets with that tag.
However, in the documentation it appears to be Iterable[str]. https://www.pantsbuild.org/docs/protobuf-python#multiple-resolves
Copy code
python_requirement(
    name="protobuf",
    # Here, we use the same version of Protobuf in both resolves. You could instead create
    # a distinct target per resolve so that they have different versions.
    requirements=["protobuf==3.19.4"],
    resolve=parametrize("resolve-a", "resolve-b"),
)

protobuf_sources(
    name="protos",
    python_resolve=parametrize("resolve-a", "resolve-b")
)
l
Ah, this seems to be a known issue: https://github.com/pantsbuild/pants/issues/19186
However; parametrizing
protobuf_sources.python_resolve
here fails with the following error: <same error that you are reporting @bland-father-19717>
@gorgeous-winter-99296 did you end up with a successful workaround?
❤️ 1
🙏 1
Does it work to explicitly write non-generator targets
protobuf_source
with parametrized resolve?
g
It's the one listed towards the end by just generating multiple targets in a loop.
l
In the issue I didn't see if it was mentioned whether using
protobuf_source
(non-generator) also failed with
resolve=parametrize
g
I don't think I tried that, I just noted that the loop didn't work with
protobuf_sources
so just expanded it manually.
👍 1
l
@bland-father-19717, fwiw this issue is now resolved and should be available in some upcoming release of pants.
b
@late-advantage-75311 Thank you for the update! I’m glad to hear the issue has been resolved and will be included in an upcoming release of Pants. I appreciate your team’s prompt and effective response.