When installing a package with NPM, can you tell it to use a different version of one of its dependencies?
dependencies, node.js, npm
Solution
NPM install syntax:
npm install (with no args in a package dir)
npm install <tarball file>
npm install <tarball url>
npm install <folder>
npm install [@<scope>/]<name> [--save|--save-dev|--save-optional] [--save-exact]
npm install [@<scope>/]<name>@<tag>
npm install [@<scope>/]<name>@<version>
npm install [@<scope>/]<name>@<version range>
npm i (with any of the previous argument usage)
so you can choose one of these methods to install your modules.
The case of the simplest way to install a specific version is this one:
npm install module@0.0.2
more info: https://docs.npmjs.com/cli/install
Problem
Say you want to install a library `lib-a` which has dependencies `dep-1` and `dep-2`. If `lib-a` has declared in its package.json to use a version of `dep-2` that is out of date (say it doesn't work on node 0.8.0 which just came out), but there is a branch of `dep-2` that works with node 0.8.0 - branch name `node0.8.0`. So the packages in the equation are: ``` git://github.com/user-a/lib-a git://github.com/user-b/dep-1 git://github.com/user-c/dep-2 git://github.com/user-c/dep-2#node0.8.0 ``` Is there a way to tell NPM to install `lib-a`, but use `dep-2#node0.8.0` instead of `dep-2`? With NPM you can install a specific branch of a project like this: ``` npm install git://github.com/user-c/dep-2#node0.8.0 ``` And if I were to customize the package.json of `lib-a`, you could tell it to use `dep-2#node0.8.0` like this: ``` { "name": "lib-a", "dependencies": { "dep-1": ">= 1.5.0", "dep-2": "git://github.com/user-c/dep-2#node0.8.0" } } ``` By modifying the package.json you can then run ``` npm install lib-a ``` and it will install the node 0.8.0 compatible `dep-2` branch. But, that requires I have access to modifying `lib-a`, which for my specific case I don't. Technically, I could fork `lib-a` and make the above change to package.json. But in my specific case, `lib-a` is a dependency of another library, so I'd have to fork the project it's referenced in, and on and on... So the question is, is there a way to tell NPM to install `lib-a`, and tell it to use the `node0.8.0` branch of `dep-2`? Something like this: ``` npm install lib-a --overrides dep-2:git://github.com/user-c/dep-2#node0.8.0 ``` That would be awesome. If it's not possible, that would be good to know so I can prepare myself to have to fork/customize the chain of projects.