bazel-contrib / bazel-contrib/rules_python

Optionally (?) regenerate `import` attributes

未关闭
#3,177 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
gazelle
主要语言
Starlark
星标
688
派生
721
平均合并
15 小时 7 分钟
30 天内合并 PR
76

描述

# 🚀 feature request

### Relevant Rules

Gazelle

### Description

The `python_root` directive will tell Gazelle to include the `imports` attribute on generated targets. Eg:

```starlark
py_library(
...
imports = ["../../.."],
...
)
```

However, when the `BUILD.bazel` and python files are moved, these `imports` are not updated when Gazelle processes that directory again, even if there were changes to the python files/imports/whatnot.

### Describe the solution you'd like

Hmm... one of:

1. Opt-in directive that tells Gazelle that it's OK to regenerate `imports`.
2. CLI arg for regenerating imports `bazel run //:gazelle -- --regen-imports` so that it can be run as a one-off
3. Always regenerate?

### Describe alternatives you've considered

Right now I run:

```
bazel run //:buildozer 'remove imports' //...:*; bazel run //:gazelle
```

Which is fine I guess. We currently use `bazel run //:gazelle` in CI to check that Gazelle won't make any modifications (CI fails if the git tree is dirty after running that command).

The problem with the above command and running it in CI is that we have targets that are intentionally _not_ managed by Gazelle. Those get modified by the `buildozer` command and then not fixed when running Gazelle.

I could probably update the `buildozer` command to ignore those unmanaged targets, but it would be quite messy - the unmanaged targets are a clusterfrack. It would be chaining `bazel query` to get the "exclude" syntax and then passing a list of managed targets to `buildozer`. Something like:

```shell
MANAGED_TARGETS=$(bazel query '//... except //foo/bar:* except //baz:* except //abc:apple')
bazel run //:buildozer 'remove imports' ${MANAGED_TARGETS}
bazel run //:gazelle
```

And I'd have to update that `query` when a new non-managed target/package is added.

贡献指南

打开贡献指南

调研方向

从这里描述的 `python_root` 指令、`BUILD.bazel` 示例和 `bazel run //:gazelle` 工作流开始。比较所提出的重新生成方法,以及它们如何与未管理的 target 和 CI 的 dirty-tree 检查交互。完成的标准是,所选择的行为会更新过时的 `imports`,但不会修改 Gazelle 不管理的 target。

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

评估

技术栈
python
领域
build-system
Issue 类型
功能
难度
5/5
预计耗时
一周以上
活跃度
停滞
描述清晰度
需要澄清
新手友好度
30/100

把新 issue 发到你的邮箱

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