Automatic dynamic resolution of pip environments
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Da chiarire
- Stato di attività
- Tranquilla
- Stack tecnologico
- python
- Ambito
- build-system
Direzione di ricerca
Inizia dal gist collegato, quindi traccia il modo in cui vengono selezionate le dipendenze di pip_A e pip_B per py_library, py_test e py_binary. Confronta il comportamento proposto di pip_dep con l’approccio basato su string_flag, config_setting e transition descritto nell’issue. Il lavoro è completato quando un design o un’implementazione documentati possono risolvere l’ambiente corretto senza flag da riga di comando per target.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Description
Consider a monorepo with many separate pip environments
- Let py_library
Adepend onnumpyand have an associated pip environment (i.e. requirements.txt.lock file) - Let py_library
Bdepend onAand a specific versionnumpy==Xand also have its own pip environment.
For B, whether we end up using the version of numpy from A or from B's pip environment depends entirely on the order of deps in the definition of B.
py_library(
name = "A",
deps = [pip_A("numpy")],
)
py_library(
name = "B",
deps = [
# If we accidentally swap the order, we are going to use `pip_A("numpy")`
pip_B("numpy"),
"//path/to:A",
],
)
When we have a big monorepo with multiple bazel subpackages and multiple pip environments this very quickly gets out of hand and can a lot of problems.
Describe the solution you'd like
It would be extremely nice if the environment can be automatically resolved. For example, instead of the above, we instead write
py_library(
name = "A",
deps = [pip_dep("numpy")],
)
py_library(
name = "B",
deps = [
pip_dep("numpy"),
"//path/to:A",
],
)
Here pip_dep automatically resolves to the correct environment at build time. For A it resolves to pip_A, for B it resolves to pip_B (this can also be propagated from py_test and py_binary). For this to function correctly the assumption is that pip_B contains all pip_A packages that A requires, but not necessarily the same versions. This can very easily be achieved with proper dependency management across pip environments - either via -r A_requirements.in or by recursive inclusion in pyproject.toml.
The above behavior is theoretically possible today by adding a special macro pip_dep which resolves based on a string_flag and config_setting. However, this is quite far from convenient from an usage perspective, for example:
- The user needs to select and pass the correct flag for any binary or test that he runs
- Simultaneously running the entire suite of tests for the monorepo is not possible since bazel needs to be invoked with a different flag for every subpackage (this also can make things a lot slower)
Ideally the correct environment can be automatically resolved for a given target based on its path in the repo (if we assume all targets under B use pip_B and all targets under A use pip_A, which is IMO a sensible assumption). Then one can enforce the correct environment via transition. On the command line targets can be invoked without any extra configuration arguments (or configuration arguments can overwrite the automatic resolution).
Example implementation https://gist.github.com/nikonikolov/3204c93621c86b6f6d10723f65e7c1b7. Likely very suboptimal and can be improved. I am in no way a bazel expert, I coded it up with the help of Gemini
Describe alternatives you've considered
- Using a single lock file for the entire repo -> most of the time impossible due to conflicting requirements in different subpackages
- Make sure that if B depends on A, it always uses the same versions of the pip packages from A. This means user need to use
-c A_requirements.txt.lockto compileB_requirements.txt.lock. With multiple subpackages and conflicting environments, one would be constantly running into version conflicts which will have to be manually resolved (if at all possible), which is obviously far from desirable (hence the need for tools such asuv pip compileorpip-compile)
- Lingua principale
- Starlark
- Stelle
- 690
- Fork
- 722
- Merge medio
- 1g 55m
- PR unite (30g)
- 38
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di bazel-contrib/rules_python
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
bazel-contrib/rules_python#4179 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
bazel-contrib/rules_python#4164 · 1 commento ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
bazel-contrib/rules_python#3821 ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
bazel-contrib/rules_python#4181 ·
-
Release 2.4.0 Apertatype: release
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
bazel-contrib/rules_python#4175 · 3 commenti ·
Tutte le issue di bazel-contrib/rules_python
Issue simili
-
Name consistency Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
eellak/triplestore#65 · 1 commento ·
-
litertlm-android AAR ships no consumer ProGuard rules → "mid == null" SIGABRT in minified apps Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
google-ai-edge/LiteRT-LM#3739 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
area-Bzlmod team-ExternalDeps type: bug untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
bazelbuild/bazel#31291 · 2 commenti ·
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
bradcypert/plum#53 ·