bazel-contrib / bazel-contrib/rules_python

Deprecate and remove implicit py_binary zipapp support

Aperta
#3,567 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Starlark
Stelle
688
Fork
721
Merge medio
15h 7m
PR unite (30g)
76

Descrizione

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")
```

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Search the repository for build_python_zip and python_zip_file, then inspect the referenced BUILD files, my_rule.bzl implementations, and rule.bzl transitions. Compare each usage with the migration cases in this issue and identify the affected Bazel targets. Done means legacy implicit zipapp paths are removed or migrated to py_zipapp_binary or py_zipapp_test without breaking the relevant builds.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
build-system
Tipo di issue
Refactoring
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
45/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.