How to write a package.json file so that all dependencies are downloaded with "npm install"

node.js, npm

Solution

The answer was provided by Brandon in a comment to another answer:

"Another thing to note is that if a package depends on a module that can be resolved further up in the dependency chain, it will. For example, since you have mongodb in your package.json, Mongoose doesn't need to install its own mongodb. – Brandon Tilley 2 days ago

Thank you Brandon! (And this is the answer...)

Problem

I wrote a simple application using node. It depends on express, mongodb and mongoose (easy). So, I created a file called `package.json` and put this in it: ``` { "name": "booking-dojo", "description": "Booking dojo app", "version": "0.0.1", "private": true, "dependencies": { "express": "3.x", "mongodb": "*", "mongoose": "*" } } ``` I then ran `npm install`, expecting npm to install those modules and their dependencies. The result was disappointing: ``` booking-dojo@0.0.1 /home/merc/Synced/Development/Bookings/app/server ├─┬ express@3.0.0rc3 │ ├── commander@0.6.1 │ ├─┬ connect@2.4.3 │ │ ├── bytes@0.1.0 │ │ ├── formidable@1.0.11 │ │ ├── pause@0.0.1 │ │ └── qs@0.4.2 │ ├── cookie@0.0.4 │ ├── crc@0.2.0 │ ├── debug@0.7.0 │ ├── fresh@0.1.0 │ ├── methods@0.0.1 │ ├── mkdirp@0.3.3 │ ├── range-parser@0.0.4 │ └─┬ send@0.0.3 │ └── mime@1.2.6 ├─┬ mongodb@1.1.4 │ └── bson@0.1.1 └─┬ mongoose@3.0.3 ├── hooks@0.2.1 └── ms@0.1.0 ``` I am confused by this, as I know that `express` needs `jade` (and much more), and `mongoose` needs `mongodb`. If I go into `node_modules/jade` and run `npm install`, the result from the main tree is very different: ``` booking-dojo@0.0.1 /home/merc/Synced/Development/Bookings/app/server ├─┬ express@3.0.0rc3 │ ├── commander@0.6.1 │ ├─┬ connect@2.4.3 │ │ ├── bytes@0.1.0 │ │ ├── formidable@1.0.11 │ │ ├── pause@0.0.1 │ │ └── qs@0.4.2 │ ├─┬ connect-redis@1.4.1 │ │ └─┬ redis@0.7.2 │ │ └── hiredis@0.1.14 │ ├── cookie@0.0.4 │ ├── crc@0.2.0 │ ├── debug@0.7.0 │ ├── ejs@0.8.2 │ ├── fresh@0.1.0 │ ├── github-flavored-markdown@1.0.1 │ ├─┬ hjs@0.0.4 │ │ └── hogan.js@2.0.0 │ ├─┬ jade@0.27.2 │ │ └── mkdirp@0.3.0 │ ├── methods@0.0.1 │ ├── mkdirp@0.3.3 │ ├─┬ mocha@1.4.0 │ │ ├── diff@1.0.2 │ │ ├── growl@1.5.1 │ │ └─┬ jade@0.26.3 │ │ └── mkdirp@0.3.0 │ ├── range-parser@0.0.4 │ ├─┬ send@0.0.3 │ │ └── mime@1.2.6 │ ├── should@1.1.0 │ ├─┬ stylus@0.29.0 │ │ └── cssom@0.2.5 │ └─┬ supertest@0.0.1 │ └─┬ superagent@0.5.0 │ ├── emitter-component@0.0.1 │ ├── formidable@1.0.9 │ ├── mime@1.2.5 │ └── qs@0.4.2 ├─┬ mongodb@1.1.4 │ └── bson@0.1.1 └─┬ mongoose@3.0.3 ├── hooks@0.2.1 └── ms@0.1.0 ``` So, `express` has grown a lot. It looks like `npm install` is only loading some of the dependencies of the sub-modules. Can somebody please shed some light on this? Why are some dependencies missing? Am I doing something wrong? (likely) Thanks! Merc.

Original source