rules_python icon indicating copy to clipboard operation
rules_python copied to clipboard

Have `python_binary_naming_convention` directive also apply to `if __name__ == "__main__":` files

Open dougthor42 opened this issue 1 year ago • 1 comments

🚀 feature request

Relevant Rules

  • gazelle

Description

The python_binary_naming_convention directive currently only applies to binaries that are generated from __main__.py files.

py_binary targets that are generated from files that contain if __name__ == "__main__": are named after their source file. From the README (emphasis mine):

If python_generation_mode is set to file, then instead of one py_binary target per module, Gazelle will create one py_binary target for each file with such a line, and the name of the target will match the name of the script.

This results in name collisions when a single file is both a binary and a library and gazelle will report:

gazelle: failed to generate target "//foobar" of kind "py_binary": a target of kind "py_library" with the same name already exists

The readme also says:

Note that it's possible for another script to depend on a py_binary target and import from the py_binary's scripts. This can have possible negative effects on Bazel analysis time and runfiles size compared to depending on a py_library target. The simplest way to avoid these negative effects is to extract library code into a separate script without a main line. Gazelle will then create a py_library target for that library code, and other scripts can depend on that py_library target.

However, for existing projects that might not be feasible.

Describe the solution you'd like

Have python_binary_naming_convention directive also apply to files that contain if __name__ ....

Or add another directive that accomplishes such.

Describe alternatives you've considered

Right now I'm just manually making all ~450 or so py_binary targets that our monorepo has :sob:

# libs are generated by gazelle
py_library(
    name = "foo",
    srcs = ["foo.py"],
    deps = [
        ":bar",
        "//bin/bom:boo",
        "@pypi:hello",
    ],
)

# binaries are manually added, using the lib as a dependency so that I don't have to keep `deps` in sync.
py_binary(
    name = "foo_bin",
    srcs = ["foo.py"],
    deps = [":foo"],
)

dougthor42 avatar Mar 19 '24 17:03 dougthor42

This issue has been automatically marked as stale because it has not had any activity for 180 days. It will be closed if no further activity occurs in 30 days. Collaborators can add an assignee to keep this open indefinitely. Thanks for your contributions to rules_python!

github-actions[bot] avatar Sep 25 '24 22:09 github-actions[bot]