how can I force npm 3 to install nested dependenci

2019-01-21 20:23发布

问题:

I just upgraded to npm version 3 and noticed one of the biggest changes it made is that it enforces a flat dependency tree.

Your dependencies will now be installed maximally flat. Insofar as is possible, all of your dependencies, and their dependencies, and THEIR dependencies will be installed in your project's node_modules folder with no nesting. You'll only see modules nested underneath one another when two (or more) modules have conflicting dependencies.

So for example if package A is dependent on package B, when you npm install A you will get this file structure:

--- root/
 |--- node_modules/
   |--- A/
   |--- B/

instead of the old file structure from version 2 or lower:

--- root/
 |--- node_modules/
   |--- A/
     |--- node_modules/
       |--- B/

The first (and I’m sure not the last) problem I ran into was this:

Package A isn’t aware of npm v3’s behavior and is dependent on package B. But A assumes the old (v2) file structure because it has node_modules/B in its code, instead of the proper ../node_modules/B. Now the code from A won’t compile because it’s looking for B/ in the wrong directory.

If I don’t feel like nagging the developer to fix the code and waiting for an update of A, I wonder if there’s a way I can set an option that will force npm to install A’s dependencies inside its own node_modules folder, the same way npm v2 would have done it.

回答1:

Have you tried --legacy-bundling for npm install?

https://docs.npmjs.com/cli/install

The --legacy-bundling argument will cause npm to install the package such that versions of npm prior to 1.4, such as the one included with node 0.8, can install the package. This eliminates all automatic deduping.



回答2:

This is what happens when I don’t get enough sleep. The obvious solution somehow escaped me.

$ cd node_modules/A/
$ npm install
$ cd ../../


回答3:

I've just ran into this issue and found an alternative to fix this issue. Since Node.js comes with NPM, the only way that I could think of was to downgrade to Node.js 0.10 version, which comes with an older version on NPM, which will install dependencies in the old fashion way. To downgrade I used NVM and ran nvm use 0.10.0. You can switch back and forth between npm versions by following this trick. Hope it helps!