posit-dev / posit-dev/rsconnect-python
`--package-installer` silently ignored in two commands and unusable as documented on click >= 8.2
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 37
- Fork
- 28
- Merge medio
- 1g 3h
- PR unite (30g)
- 7
Descrizione
--package-installer was added in #708 (c1450c57). It does not work as documented in two independent ways. Neither is visible to the current test suite.
1. write-manifest <framework> and deploy quarto accept the option and ignore it
Two code paths take package_installer and never forward it to Environment.create_python_environment:
_write_framework_manifestinrsconnect/main.py, shared bywrite-manifest streamlit|dash|bokeh|panel|shiny|api|fastapi. The call passesrequirements_file,override_python_version, andpython, but notpackage_manager.deploy_quartoinrsconnect/main.py. Same omission in itscreate_python_environmentcall.
The other commands added in #708 (deploy notebook|voila|<framework>, write-manifest notebook|voila|quarto) do pass package_manager=package_installer. git log -S "package_manager=package_installer" -- rsconnect/main.py returns only #708, so these two sites were never wired rather than wired and later lost.
Repro on click 8.1.8 (the version in uv.lock; see issue 2 for why the version matters):
$ rsconnect write-manifest shiny --overwrite --package-installer uv ./app
Checking arguments... [OK]
Inspecting Python environment... [OK]
Inspecting Shiny for Python app... [OK]
Creating manifest.json... [OK]
$ python -c "import json; print(json.load(open('app/manifest.json'))['python']['package_manager'])"
{'name': 'pip', 'version': '26.2.1', 'package_file': 'requirements.txt'}
Expected {'name': 'uv', ...}. The command exits 0 with no warning.
Consequence: deploy <framework> honors the option and write-manifest <framework> does not, so write-manifest followed by deploy manifest installs differently from the equivalent direct deploy.
2. The documented uv spelling is rejected on click >= 8.2
The option is declared as type=click.Choice(PackageInstaller) over a StrEnum. click 8.2.0 changed Choice to match enum members by name instead of by value, so the accepted spelling flips with the click version:
| click | --package-installer uv |
--package-installer UV |
|---|---|---|
| 8.1.8 | accepted | rejected |
| 8.2.1 | rejected | accepted |
| 8.3.1 | rejected | accepted |
On click 8.3.1:
$ rsconnect write-manifest shiny --overwrite --package-installer uv ./app
Error: Invalid value for '--package-installer': 'uv' is not one of 'PIP', 'UV'.
The changelog documents --package-installer=uv|pip. pyproject.toml declares click>=8.0.0 with no upper bound, so a fresh install today resolves a click where the documented invocation fails. On those versions --help also advertises the choices as PIP|UV, disagreeing with the changelog. No single spelling works across the declared click range.
This works in the repository checkout only because uv.lock pins click 8.1.8.
Why neither shows up in CI
grep -rn "package_installer" tests/ returns nothing. #708's tests cover the bundle writer at the unit level and never invoke the CLI option. Issue 1 is invisible to those tests, and issue 2 cannot appear while the lock holds click 8.1.8.
Suggested fixes
- Pass
package_manager=package_installerin thecreate_python_environmentcalls in_write_framework_manifestanddeploy_quarto. - Declare the option as
click.Choice(["pip", "uv"])and convert toPackageInstallerafterward, so the lowercase spelling works on every supported click. Bounding click would also work, at the cost of what users can install alongside. - Add a CLI-level test that asserts
manifest["python"]["package_manager"]["name"]forwrite-manifestanddeployacross the app-mode families.
Environment
- rsconnect-python 1.31.2.dev1 (
main,3d3f5841) - click 8.1.8 (from
uv.lock) and click 8.3.1 (fresh resolve) - Python 3.12, macOS
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.
Direzione di ricerca
Leggere _write_framework_manifest e deploy_quarto in rsconnect/main.py, quindi esaminare la dichiarazione dell'opzione package_installer e i test CLI esistenti; pyproject.toml e uv.lock mostrano le versioni di click supportate. Aggiungete la copertura per write-manifest e deploy verificando che l'installer selezionato raggiunga il manifest e che uv in minuscolo sia accettato nell'intero intervallo di versioni di click dichiarato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- cli, testing-qa
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Attiva
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 78/100