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.
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…)