Skip to content

fix: Support pnpm per-workspace lockfiles in turbo prune#12067

Merged
anthonyshew merged 1 commit into
mainfrom
shew/fix-issue-3541
Feb 28, 2026
Merged

fix: Support pnpm per-workspace lockfiles in turbo prune#12067
anthonyshew merged 1 commit into
mainfrom
shew/fix-issue-3541

Conversation

@anthonyshew

Copy link
Copy Markdown
Contributor

Summary

Problem

When pnpm's .npmrc has shared-workspace-lockfile=false, each workspace gets its own pnpm-lock.yaml instead of a single root-level lockfile. Turbo only looked for a root lockfile, so it either couldn't find it or found one that only contained the root's importers.

Approach

  1. .npmrc parsingNpmRc now reads shared-workspace-lockfile
  2. Lockfile mergingPnpmLockfile::merge_per_workspace_lockfiles() takes per-workspace lockfiles, re-keys their "." importers to the workspace's relative path (e.g. apps/web), and merges all packages/snapshots into a unified lockfile
  3. DiscoveryPackageManager::read_lockfile() checks .npmrc for pnpm, and when per-workspace lockfiles are detected, discovers workspace dirs via globs and merges their lockfiles
  4. Prune output cleanup — The pruned output always uses a shared lockfile, so stale per-workspace lockfiles are removed from copied workspace directories and .npmrc is rewritten to shared-workspace-lockfile=true

Testing

To verify manually, build turbo and run against the new fixture:

cargo build
# Copy fixture to a temp dir, git init, then:
turbo prune web
# Should succeed and produce a merged lockfile in out/

Rust unit tests cover .npmrc parsing and the lockfile merge logic.

@anthonyshew anthonyshew requested a review from a team as a code owner February 28, 2026 16:34
@anthonyshew anthonyshew requested review from tknickman and removed request for a team February 28, 2026 16:34
@vercel

vercel Bot commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
examples-basic-web Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
examples-designsystem-docs Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
examples-gatsby-web Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
examples-kitchensink-blog Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
examples-nonmonorepo Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
examples-svelte-web Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
examples-tailwind-web Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
examples-vite-web Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
turbo-site Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
turborepo-agents Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm
turborepo-test-coverage Ready Ready Preview, Comment, Open in v0 Feb 28, 2026 4:49pm

@github-actions

github-actions Bot commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

Coverage Report

Metric Coverage
Lines 82.52%
Functions 54.42%
Branches 0.00%

View full report

When pnpm is configured with shared-workspace-lockfile=false, each
workspace gets its own pnpm-lock.yaml instead of a single root lockfile.
turbo prune previously failed with 'no workspace found in lockfile'
because it only looked for a root-level lockfile.

This change reads shared-workspace-lockfile from .npmrc, discovers and
merges per-workspace lockfiles into a unified lockfile for graph
resolution, and ensures the pruned output uses a shared lockfile by
rewriting .npmrc and cleaning up stale per-workspace lockfiles.

Closes #3541
@anthonyshew anthonyshew merged commit 23d047d into main Feb 28, 2026
72 checks passed
@anthonyshew anthonyshew deleted the shew/fix-issue-3541 branch February 28, 2026 17:00
github-actions Bot added a commit that referenced this pull request Mar 2, 2026
## Release v2.8.13-canary.9

Versioned docs: https://v2-8-13-canary-9.turborepo.dev

### Changes

- fix: Treat `npm: alias` dependencies as external, not workspace
references (#12061) (`b179cb8`)
- test: Port 18 more prysk tests to Rust (other/ +
lockfile-aware-caching/) (#12062) (`7887af2`)
- release(turborepo): 2.8.13-canary.8 (#12063) (`2a5522a`)
- fix: Preserve file: protocol entries in pruned yarn v1 lockfile
(#12064) (`ae5c1a1`)
- perf: Use stack-allocated OidHash in FileHashes and skip expanded
hashes on normal runs (#12065) (`677b248`)
- test: Port all 8 find-turbo prysk tests to Rust (#12066) (`f827fca`)
- fix: Support pnpm per-workspace lockfiles in turbo prune (#12067)
(`23d047d`)
- test: Port final 2 prysk tests to Rust (100% complete) (#12068)
(`6d7e057`)
- fix: Resolve Berry prune failure when resolutions contain patch
overrides (#12069) (`6fe3c5e`)
- test: Add lockfile fixture for yarn berry resolution pruning (issue
#2791) (#12071) (`6cc1654`)
- chore: Remove prysk test framework entirely (#12070) (`ed2d05a`)
- refactor: Clean up test infrastructure and eliminate duplication
(#12072) (`338911d`)
- fix: Retain injected workspace package entries during pnpm lockfile
pruning (#12073) (`acbe869`)
- ci: Exclude turborepo-lsp and turborepo-schema-gen from test builds
(#12075) (`4ce12e2`)
- refactor: Clean up test infrastructure + improve test quality (#12074)
(`4571f2b`)
- ci: Remove redundant cargo build from coverage job (#12077)
(`3c9bbe2`)
- perf: Speed up lockfile test suite (#12078) (`20024df`)
- ci: Remove integration test serialization (#12079) (`24d7c02`)
- fix: Preserve `file:` and `link:` protocol entries in pruned bun
lockfile (#12076) (`2635d9a`)
- fix: Stop running unnecessary npm install in engines tests (#12081)
(`24e4905`)
- test: Add lockfile fixture for pnpm v9 injected workspace deps (issue
#8243) (#12082) (`4d4929b`)
- fix: Filter orphaned Yarn packageExtensions entries during lockfile
pruning (#12084) (`68eb223`)
- fix: Align experimentalObservability on object maps rather than arrays
(#12089) (`9b9d1e4`)
- examples: Upgrade with-react-native-web example to use latest versions
(#12085) (`980ca43`)
- fix: duplicate /signup? in Vercel URL (#12088) (`e865b51`)
- ci: Deduplicate Rust test compilation with nextest archive (#12083)
(`962cf39`)
- fix: Prevent yarn integration tests from hanging on corepack prompts
(#12090) (`29b0da7`)
- fix: Prevent turbo dev from hanging when daemon file watching fails
(#12091) (`b0d2f62`)
- ci: Skip pnpm install for Rust test jobs (#12092) (`ebd137f`)
- perf: Optimize npm lockfile parser (#12093) (`e4b4a66`)
- chore: Trim unused dependency features for faster compilation (#12094)
(`03b79e0`)
- fix: Prevent lockfile-aware yarn test from hanging on corepack
downloads (#12095) (`bf516e4`)
- fix: Exclude turborepo-repository from JS smoke test in release
workflow (#12097) (`fecc400`)

---------

Co-authored-by: Turbobot <turbobot@vercel.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant