Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
dougthor42 opened this issue Mar 19, 2024 · 0 comments
Labels
gazelle Gazelle plugin related issues

Comments

@dougthor42
Copy link
Contributor

馃殌 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 馃槶

# 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"],
)
@aignas aignas added the gazelle Gazelle plugin related issues label Mar 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
gazelle Gazelle plugin related issues
Projects
None yet
Development

No branches or pull requests

2 participants