diff --git a/.changeset/strange-actors-rescue.md b/.changeset/strange-actors-rescue.md new file mode 100644 index 0000000000..eb40768ec2 --- /dev/null +++ b/.changeset/strange-actors-rescue.md @@ -0,0 +1,7 @@ +--- +"@pnpm/headless": patch +"@pnpm/core": patch +"pnpm": patch +--- + +When `hoisted-workspace-packages` is `true` don't hoist the root package even if it has a name. Otherwise we would create a circular symlink. diff --git a/pkg-manager/core/src/install/link.ts b/pkg-manager/core/src/install/link.ts index 2c2d35a488..c4616a461a 100644 --- a/pkg-manager/core/src/install/link.ts +++ b/pkg-manager/core/src/install/link.ts @@ -228,7 +228,7 @@ export async function linkPackages ( virtualStoreDir: opts.virtualStoreDir, hoistedWorkspacePackages: opts.hoistWorkspacePackages ? projects.reduce((hoistedWorkspacePackages, project) => { - if (project.manifest.name) { + if (project.manifest.name && project.id !== '.') { hoistedWorkspacePackages[project.id] = { dir: project.rootDir, name: project.manifest.name, diff --git a/pkg-manager/core/test/install/hoist.ts b/pkg-manager/core/test/install/hoist.ts index a66e82367f..2d128c8283 100644 --- a/pkg-manager/core/test/install/hoist.ts +++ b/pkg-manager/core/test/install/hoist.ts @@ -903,6 +903,7 @@ test('hoistWorkspacePackages should hoist all workspace projects', async () => { await projects['root'].has('.pnpm/node_modules/@pnpm.e2e/bar') await projects['root'].has('.pnpm/node_modules/package') await projects['root'].has('.pnpm/node_modules/package2') + await projects['root'].hasNot('.pnpm/node_modules/root') await projects['root'].hasNot('@pnpm.e2e/foobar') await projects['root'].hasNot('@pnpm.e2e/foo') await projects['root'].hasNot('@pnpm.e2e/bar') @@ -921,4 +922,5 @@ test('hoistWorkspacePackages should hoist all workspace projects', async () => { })) await projects['root'].has('.pnpm/node_modules/package') await projects['root'].has('.pnpm/node_modules/package2') + await projects['root'].hasNot('.pnpm/node_modules/root') }) diff --git a/pkg-manager/headless/src/index.ts b/pkg-manager/headless/src/index.ts index 2eaad11a11..404b7aecef 100644 --- a/pkg-manager/headless/src/index.ts +++ b/pkg-manager/headless/src/index.ts @@ -427,7 +427,7 @@ export async function headlessInstall (opts: HeadlessOptions): Promise { - if (project.manifest.name) { + if (project.manifest.name && project.id !== '.') { hoistedWorkspacePackages[project.id] = { dir: project.rootDir, name: project.manifest.name,