Skip to content

fix(exec): resolve workspace-local bin under the linked install strategy#9648

Merged
owlstronaut merged 1 commit into
release/v11from
backport/v11/9639
Jun 24, 2026
Merged

fix(exec): resolve workspace-local bin under the linked install strategy#9648
owlstronaut merged 1 commit into
release/v11from
backport/v11/9639

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Backport of #9639 to release/v11.

…egy (#9639)

In continuation of our exploration of using `install-strategy=linked` in
the [Gutenberg
monorepo](WordPress/gutenberg#75814), which
powers the WordPress Block Editor.

Under `install-strategy=linked`, `npm exec -w <ws> -- <bin>` ignored a
workspace-local bin (provided by a sibling workspace dependency) and
fell through to the registry, producing a spurious `E404`. The hoisted
strategy ran the local bin correctly.

## Why

For a workspace exec, the command computed the local bin directory as
`resolve(this.npm.localDir, name, 'node_modules', '.bin')`, i.e.
`<root>/node_modules/<name>/node_modules/.bin`. That path only resolves
when the workspace is symlinked into the root `node_modules` as
`<name>`, which is how the hoisted strategy lays workspaces out. The
linked strategy does not hoist workspaces into the root `node_modules`;
the workspace's real bin lives at `<workspace>/node_modules/.bin`.
libnpmexec walks up from the given bin directory looking for
`node_modules/.bin/<bin>`, so starting from the nonexistent hoisted path
never reached the workspace's actual bin and the lookup fell back to the
registry.

## How

Base the local bin directory on the workspace's own path (`runPath`)
instead of the hoisted `localDir/<name>` location. This is correct under
both strategies: linked finds the bin in the workspace's
`node_modules/.bin`, and hoisted still finds the root-hoisted bin
because the walk-up continues from the workspace directory to the root
`node_modules/.bin`.

## References

Fixes #9616

(cherry picked from commit d6fbb55)
@owlstronaut owlstronaut merged commit ae64f88 into release/v11 Jun 24, 2026
37 checks passed
@owlstronaut owlstronaut deleted the backport/v11/9639 branch June 24, 2026 19:57
@github-actions github-actions Bot mentioned this pull request Jun 24, 2026
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.

2 participants