Skip to content

Vendored pnpm deployments #957

Closed

Description

@bvincent

Vendored pnpm deployments run pnpm install instead of pnpm rebuild

Summary

Since v1.9.5 pnpm is officially supported (big thanks) but pnpm projects with a pre-populated node_modules/ (vendored deployments) incorrectly run pnpm install --no-frozen-lockfile instead of pnpm rebuild.
There are two distinct bugs in BuildDependencies().


Bug 1 — case s.UsePNPM has priority over case s.IsVendored

supply.go#L342–L363

switch {
case s.UseYarn:     // L343
    s.Yarn.Build(...)
case s.UsePNPM:     // L348 ← matched first, PNPM.Build() runs
    s.PNPM.Build(...)
case s.IsVendored:  // L353 ← never reached when pnpm-lock.yaml is present
    s.NPM.Rebuild(...)
...
}

When both flags are set:

PNPM.Build() runs pnpm install, ignoring the pre-populated node_modules/.


Bug 2 — case s.IsVendored hardcodes NPM.Rebuild() regardless of package manager

Even if the ordering were fixed, case s.IsVendored at
supply.go#L353
always calls s.NPM.Rebuild(). A vendored pnpm project should call PNPM.Rebuild(),
which would also require adding Rebuild(string) error to the
PNPM interface at L51–L53
(today only Build(string, string) error exists),
mirroring npm/npm.go#L34–L51.

The same gap likely exists for Yarn vendored deployments.


Use case

We use pnpm deploy --prod to produce a flat node_modules/ layout compatible with the CF buildpack, then push the archive.
The buildpack should detect the pre-populated node_modules/ and skip the install phase, running pnpm rebuild instead to recompile any native addons for the CF stack.


How to reproduce

  1. Create a minimal pnpm workspace with a pnpm-lock.yaml and a pre-populated node_modules/.
  2. Run the buildpack supply step.
  3. Expected: pnpm rebuild is called.
  4. Actual: pnpm install --no-frozen-lockfile is called.

Activity

  1. ivanovac commented on Oct 12, 2026

    @ivanovac
    Contributor

    @bvincent Please, check the pr #964

  2. bvincent commented on Oct 12, 2026

    @bvincent
    Author

    I made a review, thanks for the fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions