Skip to content

[Idea]: Make py_*_binary configurable to behave like py_library #670

@arrdem

Description

@arrdem

It's always been a pain point that the if name == "__main__" pattern allows for Python files to serve double duty as both scripts and libraries. This creates ambiguity for Bazel and significantly Gazelle which struggle with the fact that the one file is serving double duty.

In rules_python when taking a deps = [] dependency on PyInfo providers, the py_binary machinery blithely does what it normally does which is generate an entrypoint script and propagate runfiles. This never really made sense beyond being the "natural" conclusion of depending on an action which normally produces files.

By introducing a new config_setting_flag something like @aspect_rules_py//py/private/settings:binaries_are_libraries=false, the py_*_binary rules and py_library itself could be configured to apply a transition to their deps which flips that flag. If the py_*_binary rules inspect that flag and codepath switch between the py_library impl or the "normal" binary impl, then we've created a way to turn off the longstanding missbehavior of what happens when binaries depend on fellow binaries as sources of code.

It should still be possible to force a dependency on another binary, specifically by taking a data=[] dependency which does just depend on files unlike deps which can and should have language specific meaning.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions