Skip to content

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

Description

@dougthor42

馃殌 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"],
)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Can Close?Will close in 30 days if there is no new activitygazelleGazelle plugin related issues

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions