2012-08-26 3 views
25

Ho scritto una semplice applicazione usando il nodo. Dipende da express, mongodb e mangusta (facile). Così, ho creato un file chiamato package.json e mettere questo in esso:Come scrivere un file package.json in modo che tutte le dipendenze vengano scaricate con "npm install"

{ 
    "name": "booking-dojo", 
    "description": "Booking dojo app", 
    "version": "0.0.1", 
    "private": true, 
    "dependencies": { 
    "express": "3.x", 
    "mongodb": "*", 
    "mongoose": "*" 
    } 
} 

ho poi corse npm install, aspettandosi NPM installare tali moduli e loro dipendenze. Il risultato è stato deludente:

[email protected] /home/merc/Synced/Development/Bookings/app/server 
├─┬ [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ └─┬ [email protected] 
│ └── [email protected] 
├─┬ [email protected] 
│ └── [email protected] 
└─┬ [email protected] 
    ├── [email protected].1 
    └── [email protected] 

Sono confuso da questo, come io so che express esigenze jade (e molto altro), e mongoose esigenze mongodb.
Se entro in node_modules/jade e corro npm install, il risultato dall'albero principale è molto diverso:

[email protected] /home/merc/Synced/Development/Bookings/app/server 
├─┬ [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ └── [email protected] 
│ ├─┬ [email protected] 
│ │ └─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ └─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ └─┬ [email protected] 
│ └─┬ [email protected] 
│  ├── [email protected] 
│  ├── [email protected] 
│  ├── [email protected] 
│  └── [email protected] 
├─┬ [email protected] 
│ └── [email protected] 
└─┬ [email protected] 
    ├── [email protected] 
    └── [email protected] 

Quindi, express ha cresciuto un sacco. Sembra che npm install stia caricando solo di alcune delle dipendenze dei sotto-moduli.

Qualcuno può per favore far luce su questo? Perché mancano alcune dipendenze? Sto facendo qualcosa di sbagliato? (probabile)

Grazie!

Merc.

risposta

7

La risposta è stata fornita da Brandon in un commento ad un'altra risposta:

"Un'altra cosa da notare è che se un pacchetto dipende da un modulo che può essere risolto più in alto nella catena di dipendenza, lo farà per. esempio, dato che hai mongodb nel tuo pacchetto.json, Mongoose non ha bisogno di installare il proprio mongodb - Brandon Tilley 2 giorni fa

Grazie Brandon! (E questa è la risposta ...)

38

Sei confuso su almeno 2 punti.

In primo luogo, esprimere non dipende giada, come si può vedere leggendo il file node_modules/express/package.json:

"dependencies": { 
    "connect": "2.4.2", 
    "commander": "0.6.1", 
    "range-parser": "0.0.4", 
    "mkdirp": "0.3.3", 
    "cookie": "0.0.4", 
    "crc": "0.2.0", 
    "fresh": "0.1.0", 
    "methods": "0.0.1", 
    "send": "0.0.3", 
    "debug": "*" 
    } 

espresso, tuttavia, il lavoro con giada se è disponibile, così come molti altri motori di template. Quindi, per risolvere questo elenco jade come una dipendenza nel file package.json e starai bene.

In secondo luogo, npm installa solo pacchetti nodo, non cose di terze parti come mongodb. È necessario installare mongodb e qualsiasi altra dipendenza che non sia un modulo npm utilizzando altri mezzi (apt-get, yum, installazione manuale, ecc.).

Quindi npm installa le dipendenze in modo ricorsivo, ma solo i moduli npm.

+1

Un'altra cosa da notare è che se un pacchetto dipende da un modulo che può essere risolto più in alto nella catena di dipendenza, lo farà. Ad esempio, dal momento che hai 'mongodb' nel tuo pacchetto.json, Mongoose non ha bisogno di installare il proprio' mongodb'. –

+0

Brandon, questa * è * la risposta. L'ho capito solo non molto tempo fa. Fondamentalmente, non installa MongoDb in Mongoose perché è stato risolto ulteriormente. Poiché questa * è * la risposta effettiva, puoi aggiungerla come risposta appropriata, piuttosto che come commento, in modo che io possa accettarla? – Merc

+0

@Peter Buon punto, le applicazioni * generate * da espresso avranno comunque espresso come dipendenza BTW. La mia domanda, "perché mancano alcune dipendenze?", Ha la risposta semplice (fornita da Brandon) "Mancano perché sono state risolte più in alto nell'albero delle dipendenze". Grazie! – Merc

4

utilizzare questo esempio

{ 
 
    "name": "app", 
 
    "version": "0.0.1", 
 
    "main":"test.js", 
 
    "author":"Test", 
 
    "description": "For test ", 
 
    "dependencies": { 
 
    "express": "latest", 
 
    "mongoose": "latest" 
 
    } 
 

 
}