I am using the workspaces feature of node/npm and the layout is like that:
.
+-- package.json
`-- packages
`-- p1
`-- package.json
`-- p2
`-- package.json
./package.json
{
…
"workspaces": [
"./packages/*"
],
…
"dependcies": { … }
…
}
npm install and everything is working to far. But now I would like to add the package p1 as dependency to package p2. But how do I have to do that? Naively I have tried that:
./packages/p2/package.json
{
…
"dependencies": {
"p1": "*"
}
…
}
But that yields an error on install, telling me that p1 cannot be found the registry.
UPDATE - using npm cli
From the project root directory run
npm i ./packages/p1 -w packages/p2
The ./ is a MUST or else npm will confuse the install as a package install from npm registry vs from a local directory.
Manual Workaround
Manually add p1 as a local dependency by providing p1's relative path in p2 package.json, so in your example:
./packages/p2/package.json
{
…
"dependencies": {
"p1": "file:../p1"
}
…
}
Then you'll need to run npm install in the p2 package.
I found that solution from a LinkedIn article Things I wish I had known when I started JavaScript monorepo with Lerna.
That naive approach should work, which makes me suspect that maybe there's something wrong in your setup. Couple of things you can double-check:
"name" field in ./p1/package.json exactly p1 ? (for example, if you're using scoped names then it might be that you need to use @scopename/p1 in ./p2/package.json "dependencies" instead)npm -v (currently v7.23.0)p1 package is properly symlinked in the ./node_modules folder, e.g: ls -l ./node_modules/p1But how do I have to do that?
Given that everything is properly setup, you can add packages as dependencies of a workspace (including another workspace) using the -w <workspace-name> argument, e.g: (adding p1 as a dep of p2) npm install p1 -w p2, ref: https://docs.npmjs.com/cli/v7/using-npm/workspaces#adding-dependencies-to-a-workspace