bazel-contrib / bazel-contrib/rules_python

(feat request) Add a gazelle directive for using `requirement()` for pip-installable dependencies

Aperta
#1,789 4 commenti 1 reazione 0 assegnatari Vedi su GitHub
Can Close? gazelle
Lingua principale
Starlark
Stelle
688
Fork
721
Merge medio
15h 7m
PR unite (30g)
76

Descrizione

# 🚀 feature request

### Relevant Rules

+ gazelle
+ requirements.bzl

### Description

Gazelle generates deps using the library labels directly, rather than using `requirement()` (possibly because of the [drawbacks of `requirement()`](https://github.com/bazelbuild/rules_python/issues/414)).

```starlark
# using labels
py_library(
name = "foo",
srcs = ["foo.py"],
deps = ["@pip_parse_name//boto3"],
)
```

```starlark
# using `requirement()` function
load("@pip_parse_name//:requirements.bzl", "requirement")

py_library(
name = "foo",
srcs = ["foo.py"],
deps = [requirement("boto3")],
)
```

It would be great if we could configure this on a per-package basis. Users would then be able to opt-in to using `requirement()`, making the transition from manually-built BUILD files to gazelle-generated files much easier (as the diff will be much smaller or nonexistent[^1]).

[^1]: The [docs](https://rules-python.readthedocs.io/en/latest/pypi-dependencies.html#using-third-party-packages) guide users to use `requirement()` initially, and I'm not sure how many people opt to use labels instead.

### Describe the solution you'd like

Add a new directive `gazelle:python_use_pip_requirement_function` (or similar name) that accepts 3 values:

+ **`false` (the default):** Use library labels directly. Same as current behavior.
+ **`true`:** Use `requirement("library")`
+ **`DEFAULT` or `RESET`:** reset to the default as defined by `rules_python`.

Example:

```starlark
# no directive set. Use labels directly.
py_library(
...,
deps = ["@pip_parse_name//boto3"],
)

# gazelle:python_use_pip_requirement_function false
py_library(
...,
deps = ["@pip_parse_name//boto3"],
)

# gazelle:python_use_pip_requirement_function true
load("@pip_parse_name//:requirements.bzl", "requirement")
py_library(
...,
deps = [requirement("boto3")],
)

# gazelle:python_use_pip_requirement_function DEFAULT
py_library(
...,
deps = ["@pip_parse_name//boto3"],
)
```

### Describe alternatives you've considered

None 🙃. I'm happy to hear some though.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia individuando la generazione delle dipendenze Python di Gazelle e il modo in cui requirements.bzl è integrato. Esamina la gestione esistente delle direttive e la generazione delle label delle dipendenze prima di decidere dove debba collocarsi l'impostazione per pacchetto. Il lavoro è completato quando la direttiva supporta true, false e il comportamento di reset richiesto, con copertura per le label generate, le chiamate a requirement() e l'istruzione load.

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

Valutazione

Stack tecnologico
python
Ambito
build-system
Tipo di issue
Funzionalità
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.