bazel-contrib / bazel-contrib/rules_python

Deprecate and remove implicit py_binary zipapp support

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

描述

The implicit zipapp support of `py_binary` and `py_test` is being deprecated and removed. It is replaced by the `py_zipapp_binary` and `py_zipapp_test` rules. There are several ways the implicit zipapp logic may be activated.

For reference, these are the two loads you're most likely to need:

```
load("@rules_python//python/zipapp:py_zipapp_binary.bzl", "py_zipapp_binary")
load("@rules_python//python/zipapp:py_zipapp_test.bzl", "py_zipapp_test")
```

The flag name you want to look for is `build_python_zip`.

> **Windows-specific note**: Windows enables zipapp by default, so the _absence_ of the flag is the same as `--build_python_zip=true` !

# Migration guide

This guide tries to give information on how to handle all possible cases of what may need to be migrated. Most changes are small, should be transparent, and can be done incrementally.

In practice, the most likely scenario you'll need to fix is using the
`--build_python_zip` flag on the command line -- see the "Migrate explicit --build_python_zip" section for that case.

## Disable legacy zipapp flag

Add `common --build_python_zip=false --@rules_python//python/config_settings:build_python_zip=false` to your `.bazelrc`

> **Windows-specific note**: Windows enables zipapp by default

## Migrate explicit `--build_python_zip` usage

TLDR: Replace `--build_python_zip` on the command line with a `py_zipapp_binary` target in a BUILD file.

Replace this:

```
# File: BUILD

py_binary(name="bin")

# Command line
bazel build //:bin --build_python_zip
```

With this:

```
# File: BUILD
load("@rules_python//python/zipapp:py_zipapp_binary", "py_zipapp_binary")

py_binary(name="bin")
py_zipapp_binary(name = "bin_zipapp", binary=":bin")

# Command line
bazel build //:bin_zipapp
```

## Migrate `py_binary` using `config_settings` with `py_zipapp` rule

TLDR: Add `py_zipapp_binary` for each `py_binary` you want as a zipapp

Replace this:
```
py_binary(
name = "bin"
config_settings = {
"@rules_python//python/config:build_python_zip": "true",
"//command_line_option:build_python_zip": "true",
},
...
)
```

With this:

```
load("@rules_python//python/zipapp:py_zipapp_binary", "py_zipapp_binary")

py_binary(
name = "bin"
...
)

py_zipapp_binary(
name = "bin.zipapp",
binary = ":bin",
)
```

## Migrate `filegroup` using `python_zip_file` output group

Replace this:

TLDR: Add `py_zipapp_binary` and point the filegroup to it.

```
py_binary(name = "bin", ...)

filegroup(
name = "bin_zip_file",
output_group = "python_zip_file",
srcs = [":bin"],
)
```

With this:

```
load("@rules_python//python/zipapp:py_zipapp_binary", "py_zipapp_binary")

py_binary(name = "bin", ...)
py_zipapp_binary(name = "bin_zipapp", binary=":bin")
filegroup(
name = "bin_zip_file",
output_group = "python_zip_file",
srcs = [":bin_zipapp"],
)
```

## Migrate Starlark using `python_zip_file` output group

TLDR: Add `py_zipapp` target and use it as the input target instead.

Replace this:

```
# File: my_rule.bzl
def _my_rule_impl(ctx):
zip_file = ctx.attr.binary[OutputGroupInfo]["python_zip_file"].to_list()[0]

# File: BUILD.bazel
py_binary(name="bin", ...)
my_rule(name = "mytarget", binary=":bin", ...)
```

With this:

```
# File: my_rule.bzl

def _my_rule_impl(ctx):
zip_file = ctx.attr.binary[OutputGroupInfo]["python_zip_file"].to_list()[0]

# File: BUILD.bazel
load("@rules_python//python/zipapp:py_zipapp_binary", "py_zipapp_binary")
py_binary(name="bin", ...)
py_zipapp_binary(name = "bin_zipapp", binary=":bin")
my_rule(name = "mytarget", binary=":bin_zipapp", ...)
```

## Migration transitions setting build_python_zip flags

TLDR: Remove the `build_python_zip` flags from the transition and refactor into a separate target.

Replace this:

```
# File: rule.bzl
my_transition = transition(
outputs = [
"//command_line_settings:build_python_zip",
"@rules_python//python/config_settings:build_python_zip",
],
...
)
my_rule(cfg = my_transition, ...)

# File: BUILD
py_binary(name="bin", ...)
my_rule(target=":bin")
```

With this:

```
# File: rule.bzl
my_transition = transition(
outputs = [],
...
)
my_rule(cfg = my_transition, ...)

# File: BUILD
load("@rules_python//python/zipapp:py_zipapp_binary", "py_zipapp_binary")
py_binary(name="bin", ...)
py_zipapp_binary(name="bin_zipapp", binary=":bin")
my_rule(target=":bin_zipapp")
```

贡献指南

打开贡献指南

调研方向

在仓库中搜索 build_python_zip 和 python_zip_file,然后检查所引用的 BUILD 文件、my_rule.bzl 实现以及 rule.bzl 的 transition。将每个用法与此 issue 中的迁移案例进行比较,并确定受影响的 Bazel targets。完成标准是:移除旧的隐式 zipapp 路径,或将其迁移到 py_zipapp_binary 或 py_zipapp_test,同时不破坏相关构建。

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

评估

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

把新 issue 发到你的邮箱

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