bazel-contrib / bazel-contrib/rules_python
Bazel can overwrite __init__.py with empty file in source tree
- 主要言語
- Starlark
- スター
- 688
- フォーク
- 721
- 平均マージ
- 15時間 7分
- マージ済み PR(30日)
- 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 の動作を再現し、その後、2 つの py_test ターゲットが some_package/__init__.py をどのように扱うかを調べます。correct_test、bad_dep_test、そしてもう一度 correct_test を実行して上書きを確認します。bad test がソースファイルを空にしなくなり、good test が引き続きパスすれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- build-system
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- 明確に書かれている
- 初心者へのやさしさ
- 45/100