Specify path to node_modules in package.json

node.jsNpm

node.js Problem Overview


Is there a way to move the node_modules directory in an application to let's say /vendor/node_modules like bower does with the bowerrc file? I thought it could be specified in package.json but I can't seem to find a solution. Your help is much appreciated.

node.js Solutions


Solution 1 - node.js

yes you can, just set the NODE_PATH env variable :

export NODE_PATH='yourdir'/node_modules

According to the doc :

> If the NODE_PATH environment variable is set to a colon-delimited list > of absolute paths, then node will search those paths for modules if > they are not found elsewhere. (Note: On Windows, NODE_PATH is > delimited by semicolons instead of colons.) > > Additionally, node will search in the following locations: > > 1: $HOME/.node_modules > > 2: $HOME/.node_libraries > > 3: $PREFIX/lib/node > > Where $HOME is the user's home directory, and $PREFIX is node's > configured node_prefix. > > These are mostly for historic reasons. You are highly encouraged to > place your dependencies locally in node_modules folders. They will be > loaded faster, and more reliably.

Source

Solution 2 - node.js

In short: It is not possible, and as it seems won't ever be supported (see here https://github.com/npm/npm/issues/775).

There are some hacky work-arrounds with using the CLI or ENV-Variables (see the current selected answer), .npmrc-Config-Files or npm link - what they all have in common: They are never just project-specific, but always some kind of global Solutions.

For me, none of those solutions are really clean because contributors to your project always need to create some special configuration or have some special knowledge - they can't just npm install and it works.

So: Either you will have to put your package.json in the same directory where you want your node_modules installed, or live with the fact that they will always be in the root-dir of your project.

Solution 3 - node.js

Yarn supports this feature:

# .yarnrc file in project root
--modules-folder /node_modules

But your experience can vary depending on which packages you use. I'm not sure you'd want to go into that rabbit hole.

Solution 4 - node.js

I'm not sure if this is what you had in mind, but I ended up on this question because I was unable to install node_modules inside my project dir as it was mounted on a filesystem that did not support symlinks (a VM "shared" folder).

I found the following workaround:

  1. Copy the package.json file to a temp folder on a different filesystem
  2. Run npm install there
  3. Copy the resulting node_modules directory back into the project dir, using cp -r --dereference to expand symlinks into copies.

I hope this helps someone else who ends up on this question when looking for a way to move node_modules to a different filesystem.

Other options

There is another workaround, which I found on the github issue that @Charminbear linked to, but this doesn't work with grunt because it does not support NODE_PATH as per https://github.com/browserify/resolve/issues/136:

> lets say you have /media/sf_shared and you can't install symlinks in > there, which means you can't actually npm install from > /media/sf_shared/myproject because some modules use symlinks. > > * $ mkdir /home/dan/myproject && cd /home/dan/myproject > * $ ln -s /media/sf_shared/myproject/package.json (you can symlink in this > direction, just can't create one inside of /media/sf_shared) > * $ npm install > * $ cd /media/sf_shared/myproject > * $ NODE_PATH=/home/dan/myproject/node_modules node index.js

Solution 5 - node.js

What if I am inside docker and I want to persist the node_modules in a volume? Then, having the node_modules inside of my app path is not an option for me.

When I deploy new code into the container, I put a tar into it, extract it to a temporary folder and then rsync from that to the app directory. I have the --delete flag set for rsync, so everything that's not in the tar is removed from the app folder. That also applies to the node_modules folder, so unfortunately the only solution that worked for me is the following:

> Create a symbolic link in the app directory to a directory that contains the node_modules and is mounted into the container from the host.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsturoidView Question on Stackoverflow
Solution 1 - node.jsxShiraseView Answer on Stackoverflow
Solution 2 - node.jsDavid LosertView Answer on Stackoverflow
Solution 3 - node.jsVanuanView Answer on Stackoverflow
Solution 4 - node.jsRichView Answer on Stackoverflow
Solution 5 - node.jsmfittkoView Answer on Stackoverflow