Let the members of a uv workspace opt into one Python environment. A workspace root that declares [tool.uv.workspace] can set `shared-environment = true` under [tool.pnpm.python]. pnpm then resolves every member as one graph into one pylock.toml and one .venv at the workspace root, the way uv resolves a workspace, while each project keeps an environment of its own by default. Sharing is opt-in because uv's model, which always shares, forces a repository whose projects genuinely conflict to split into separate workspaces; per-project resolution needs no such split. The installer now prepares units rather than projects: a unit is a project on its own or the members of a shared workspace, with one interpreter, one lockfile and one environment. Workspace::memberships groups the selected projects by the directory they install into, and selecting any member of a shared environment prepares the whole membership. The lockfile records the members under tool.pnpm.members and the interpreter range they accept together as requires-python, so a member joining or leaving invalidates it. A single-project unit records neither, so existing lockfiles stay valid. Two members that require versions of one distribution no offered release satisfies at once are refused with an error naming both, wrapped around pubgrub's report, which names the project as one root and cannot say which members disagree. An add without --filter in a workspace now discovers the workspace around the edited project instead of that manifest alone: whether the project shares an environment, and which projects it may take from the repository, are declared around it. pnpm run and pnpm exec resolve the environment the way the install assigned it: the nearest directory with a manifest is the project, the nearest workspace declared at or above it is the one it belongs to, and only a member of a workspace that shares its environment uses the root's .venv. The dynamic metadata of a shared workspace's members is prepared with the interpreter the members share, and an add rereads every member of the units it edits once the workspace lock is held. The workspace state file is renamed into place through pnpm_fs::rename_with_retry, so two pnpm processes installing one workspace at once no longer fail on Windows when the second rename finds the first still holding the file. Follows up on item 14 of pnpm/pnpm#14945. Closes pnpm/pnpm#15015.
565 B
565 B
pacquet
| pacquet |
|---|
| minor |
The members of a uv workspace can now share one Python environment. Set shared-environment = true under [tool.pnpm.python] in the pyproject.toml that declares [tool.uv.workspace]. pnpm install then resolves every member as one graph into one pylock.toml and one .venv at the workspace root. Two members that require versions of a distribution no release satisfies at once are refused with an error naming both. Each project still gets an environment of its own by default #15015.