rules_python icon indicating copy to clipboard operation
rules_python copied to clipboard

Gazelle: Presence of `__main__.py` prevents other `*.py` files from being mapped as `py_binary` targets

Open dougthor42 opened this issue 3 months ago • 0 comments

🐞 bug report

Affected Rule

Gazelle

Is this a regression?

Still checking

Description

Presence of __main__.py prevents other *.py files from being mapped as py_binary targets.

🔬 Minimal Reproduction

Add one file to gazelle/python/testdata/per_file:

# gazelle/python/testdata/per_file/my_binary.py
if __name__ == "__main__":
    print("hey")

Run the test (from the gazelle/ dir) bazel test //python:python_test_per_file and see that a py_binary target is added. So far so good!

Now add a __main__.py file, no content needed: touch gazelle/python/testdata/per_file/__main__.py

And run the test again. You'll see that my_binary.py was incorrectly added as a py_library target.

Other

This is the "correct" BUILD.out file:

--- a/gazelle/python/testdata/per_file/BUILD.out
+++ b/gazelle/python/testdata/per_file/BUILD.out
@@ -1,4 +1,4 @@
-load("@rules_python//python:defs.bzl", "py_library", "py_test")
+load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test")
 
 # gazelle:python_generation_mode file
 
@@ -23,6 +23,19 @@ py_library(
     deps = [":custom"],
 )
 
+py_binary(
+    name = "my_binary",
+    srcs = ["my_binary.py"],
+    visibility = ["//:__subpackages__"],
+)
+
+py_binary(
+    name = "per_file_bin",
+    srcs = ["__main__.py"],
+    main = "__main__.py",
+    visibility = ["//:__subpackages__"],
+)
+
 py_test(
     name = "bar_test",
     srcs = ["bar_test.py"],

dougthor42 avatar Oct 10 '25 23:10 dougthor42