Have `python_binary_naming_convention` directive also apply to `if __name__ == "__main__":` files
🚀 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_modeis set tofile, then instead of onepy_binarytarget per module, Gazelle will create onepy_binarytarget 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"],
)
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!