Reputation: 5708
I have a package (package-a
) that depends on another package (package-b
) which is not published to npm but is on my file system. When I run npm install
from package-a
, package-b
's dependencies are not installed. I have to navigate to package-b
's directory and run npm install
manually. Is there a way to install both packages' dependencies with a single npm command?
Here's my directory structure:
/
...
shared/
...
javascript/
...
package-b/
package.json
package-a/
package.json
Per the docs, I placed the following in package-a/package.json
. (I'm using npm 5+)
dependencies: {
package-b: "file:../shared/javascript/package-b",
}
When I navigate to /package-a
and run npm install
, it installs all of package-a
's dependencies like normal and also copies the package-b
directory to package-a/node_modules
. This is presumably what lets me type require('package-b')
instead of require('../shared/javascript/package-b')
.
However, as I stated before, package-b
s dependencies are not installed, so if I try to use package-a
, I get an error when package-b
is require
d because it is trying to use dependencies that do not exist locally.
Once again, to solve this, I can navigate to package-b
and run npm-install
, but I'm hoping there's a better solution as I may have many such sub packages and I'd like to avoid having to write a shell script to go install all my dependencies if I can do this with an npm command. (perhaps I just did something wrong and npm install
should be working?)
Follow up question: when I run npm install
from package-b
's directory, the packages are installed there, but not in the version of package-b
that got copied to /package-a/node_modules
during the first npm install
, yet everything still works. So now it seems like when I require('package-b')
it is actually resolving to /shared/javascript/package-b
and NOT /package-a/node_modules/package-b
. So what's the point of copying the file in the first place?
It turns out this is a bug in npm 5. It only occurrs when installing from a package-lock.json
file. (Github Issue)
Upvotes: 3
Views: 1875
Reputation: 91515
The files are (probably) not being copied, they're being symbolically linked (symlink). This essentially creates an alias/shortcut that looks like a real directory, but points to another path.
This is how the older npm link
feature worked. The reason is the code stays "live"; Changes in the linked module are reflected whenever you run the module that's referencing them, meaning you don't have to npm update
all the time.
Upvotes: 1