bazel-contrib / bazel-contrib/rules_python
Can Gazelle's 'resolve' directive be smarter? Or am I just using it wrong?
- Ngôn ngữ chính
- Starlark
- Star
- 688
- Fork
- 721
- Merge trung bình
- 15 giờ 7 phút
- Pull request đã merge (30 ngày)
- 76
Mô tả
# :question: question | possible 🚀 feature request
### Relevant Rules
+ gazelle
### Description
Can Gazelle's 'resolve' directive be smarter? Or am I just using it wrong?
Example:
```
# gazelle:resolve py foo @other//foo
```
| Import | Expected Dep | Actual Dep |
| --- | --- | --- |
| `import foo.bar.baz` | `"@other//foo/bar:baz"` | `"@other//foo"` |
| `from foo import bar` | `"@other//foo:bar"` | `"@other//foo"` |
| `import foo.bar as bar` | `"@other//foo/bar"` | `"@other//foo"` |
This is coming about because we have a nested project with a dir structure like:
```
./main_project_repo
+ BUILD.bazel
+ MODULE.bazel # module(name = "main_project_repo")
+ src/
+ BUILD.bazel # sets python_root
+ main_project/
+ BUILD.bazel
+ foo.py # imports other_project_repo/src/other_project/bar.py
# via `import other_project.bar` thanks to PYTHONPATH
+ private.py
+ other_project_repo/
+ BUILD.bazel
+ MODULE.bazel # module(name = "other_project_repo")
+ src/
+ BUILD.bazel # sets python_root
+ other_project/
+ BUILD.bazel
+ bar.py
```
And `./main_project_repo/src/main_project/BUILD.bazel` looks like so to work:
```starlark
# //src/main_project:foo
py_library(
name = "foo",
srcs = ["foo.py"],
deps = [
":private",
"@other_project_repo//src/other_project:bar"
],
)
```
With the current functionality, I'd have to write out resolve directives for every import used
```
# gazelle:resolve py other_project @other_project_repo//src/other_project
# gazelle:resolve py other_project.bar @other_project_repo//src/other_project:bar
# gazelle:resolve py other_project.foobar @other_project_repo//src/other_project/foobar
# gazelle:resolve py other_project.foobar.hello @other_project_repo//src/other_project/foobar:hello
# gazelle:resolve py other_project.foobar.goodbye @other_project_repo//src/other_project/foobar:goodbye
...
```
Sadly this is not feasible given the size of our codebases.
### Describe the solution you'd like
I may be in the wrong, but it seems like the directive should match the start of the import and then follow the rest of the import path. I'm not exactly sure how, or even if, this would work though (see example 2).
#### Example 1
```
# gazelle:resolve py foo @other//foo
# import foo --> @other//foo
# import foo.bar --> @other//foo:bar
```
#### Example 2
```
# gazelle resolve py hello.world //goodbye:world
# import hello --> //hello # no change because it's not matched by resolve.
# import hello.world --> //goodbye:world # no change from current functionality
# import hello.world.again --> ... I donno. Can't be //goodbye:world:again haha
```
### Describe alternatives you've considered
We might be able to run buildozer and modify all the deps in `./main_project_repo/src` after Gazelle generates them, but I haven't looked into how feasible that actually is.
Hướng dẫn đóng góp
Hướng nghiên cứu
Bắt đầu với các chỉ thị `gazelle:resolve` và các ví dụ `BUILD.bazel` trong issue, sau đó theo dõi cách các import Python như `foo.bar` được ánh xạ vào các dependency. Xác định hành vi rõ ràng, không mơ hồ cho các import lồng nhau, đặc biệt là trường hợp `hello.world.again`; để được xem là hoàn thành, cần có một mô hình phân giải đã được thống nhất cùng với phần triển khai và độ bao phủ tương ứng.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- build-system
- Loại issue
- Tính năng
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 30/100