bazel-contrib / bazel-contrib/rules_python

Bazel can overwrite __init__.py with empty file in source tree

未关闭
#2,947 5 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
core-rules type: bug
主要语言
Starlark
星标
688
派生
721
平均合并
15 小时 7 分钟
30 天内合并 PR
76

描述

### Description of the bug:

If I mess up my BUILD structure, and forget to include `srcs = ["__init__.py"]`, it seems it can happen that Bazel overwrites the existing `__init__.py` with an empty file.

### Reproduce:

Setup the directory:
```
cd $(mktemp -d)
cat > MODULE.bazel <<-EOF
module(name = "test_module")

bazel_dep(name = "rules_python", version = "1.4.1")
EOF
mkdir some_package
cat > some_package/BUILD.bazel <<-EOF
load("@rules_python//python:defs.bzl", "py_library", "py_test")
py_library(
name = "_some_library",
srcs = ["_some_library.py"],
)
py_library(
name = "some_package",
srcs = ["__init__.py"],
deps = [":_some_library"],
)
py_test(
name = "correct_test",
srcs = ["test.py"],
main = "test.py",
deps = [":some_package"],
)
py_test(
name = "bad_dep_test",
srcs = ["test.py"],
main = "test.py",
deps = [":_some_library"],
)
EOF
cat > some_package/__init__.py <<-EOF
import some_package._some_library
method=_some_library.method
EOF
cat > some_package/_some_library.py <<-EOF
def method():
pass
EOF
cat > some_package/test.py <<-EOF
import some_package
some_package.method()
EOF
```

Double check the with `tree`. This gives:
```
.
├── MODULE.bazel
└── some_package
├── BUILD.bazel
├── __init__.py
├── _some_library.py
└── test.py
```

Run the good test -- it will pass.
```
bazel test //some_package:correct_test
```

Then run the bad test. It fails and overwrites `__init__.py`.
```
bazel test //some_package:bad_dep_test
```

The run the good test. It now fails.
```
bazel test //some_package:correct_test
```

Note: Setting common --incompatible_default_to_explicit_init_py in .bazelrc fixes this.

See also https://github.com/bazel-contrib/rules_python/issues/2945.

贡献指南

打开贡献指南

调研方向

使用 MODULE.bazel 和 some_package/BUILD.bazel 重现 issue 中的行为,然后检查两个 py_test 目标如何处理 some_package/__init__.py。运行 correct_test、bad_dep_test,然后再次运行 correct_test,以确认覆盖行为;当错误测试不再清空源文件且正确测试继续通过时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
build-system
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
描述清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。