microsoft / microsoft/vscode-python-environments

Poetry package listing fails for nested/non-root pyproject.toml projects (`poetry show` runs with wrong cwd)

Aperta
#1,779 1 commento 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

triage-needed
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
  1. Monorepo with pyproject.toml only in a subfolder, e.g. scripts/pyproject.toml.
  2. Add to .vscode/settings.json:
    "python-envs.pythonProjects": [
      { "path": "scripts", "envManager": "ms-python.python:poetry", "packageManager": "ms-python.python:poetry" }
    ]
    
  3. Open "Manage Packages" for the scripts project'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 with environment, e.g. via api.getPythonProject(environment.environmentPath) or similar) into PoetryShowTopLevelCommand in getDirectPackageNames().
  • 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 by envId.id equality across all projects.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. 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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.