microsoft / microsoft/vscode-python-environments
Poetry package listing fails for nested/non-root pyproject.toml projects (`poetry show` runs with wrong cwd)
Nessuno ha ancora preso questa issue.
- Lingua principale
- TypeScript
- Stelle
- 138
- Fork
- 62
- Merge medio
- 1g 4h
- PR unite (30g)
- 35
Descrizione
Environment
- vscode-python-envs version: 1.36.0
- OS: Linux (devcontainer, linux-arm64)
- Poetry: 2.4.3
Description
When a Poetry project is registered via python-envs.pythonProjects but is not at the workspace root (e.g. a monorepo with scripts/pyproject.toml), the "Manage Packages" package listing fails with:
poetry: Poetry could not find a pyproject.toml file in <extension host cwd> or its parents
Root cause (found in source)
PoetryPackageManager.getDirectPackageNames() (src/managers/poetry/poetryPackageManager.ts) builds PoetryShowTopLevelCommand without ever passing a cwd:
const showTopLevelCmd = new PoetryShowTopLevelCommand({
pythonExecutable: poetry,
log: this.log,
});
This means poetry show --no-ansi --top-level always inherits the extension host process's own cwd (in a remote/devcontainer setup this is the vscode-server install directory), not the project directory. This is confirmed intentional by the existing unit test poetryPackageManager.unit.test.ts: "direct package listing inherits the process working directory" asserts runPoetryStub.firstCall.args[1] === undefined.
fetchPackagesFromTool() (used for plain poetry show --no-ansi) does compute a cwd via getPoetryCwd(), but that logic only reliably resolves when api.getPythonProjects() returns exactly one project. Since VS Code always implicitly adds the workspace root as a project (PythonProjectManagerImpl.getInitialProjects()), any repo with a registered non-root Poetry project (e.g. scripts/) ends up with 2+ projects, forcing the "match by environment identity" branch — which can return an empty matchingDirectories set (and thus undefined cwd) depending on how the workspace-root's own resolved environment compares.
Repro
- Monorepo with
pyproject.tomlonly in a subfolder, e.g.scripts/pyproject.toml. - Add to
.vscode/settings.json:"python-envs.pythonProjects": [ { "path": "scripts", "envManager": "ms-python.python:poetry", "packageManager": "ms-python.python:poetry" } ] - Open "Manage Packages" for the
scriptsproject's Poetry environment.
Expected
poetry show commands run with cwd set to the registered project directory (scripts/).
Actual
Both poetry show --no-ansi --top-level and poetry show --no-ansi fail with "could not find a pyproject.toml", repeating every time packageWatchers triggers an auto-refresh.
Suggested fix
- Pass
cwd(resolved from the project associated withenvironment, e.g. viaapi.getPythonProject(environment.environmentPath)or similar) intoPoetryShowTopLevelCommandingetDirectPackageNames(). - In
getPoetryCwd(), prefer resolving cwd from the actual project that owns the environment (e.g. via reverse lookup by environment path) rather than only matching byenvId.idequality across all projects.
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
Inizia da src/managers/poetry/poetryPackageManager.ts, in particolare da getDirectPackageNames() e getPoetryCwd(), poi leggi poetryPackageManager.unit.test.ts e la relativa asserzione esistente sulla directory di lavoro del processo. Traccia come vengono risolti il progetto registrato e l’ambiente per i progetti annidati. Il lavoro è completato quando entrambi i comandi poetry show usano la directory del progetto registrato e gli unit test coprono questo comportamento di cwd.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python, typescript
- Ambito
- developer-experience, tooling
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Attiva
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 74/100