2012-08-26 25 views
25

Escribí una aplicación simple usando un nodo. Depende de express, mongodb y mangosta (fácil). tanto, he creado un archivo llamado package.json y poner esto en él:Cómo escribir un archivo package.json para que todas las dependencias se descarguen con "npm install"

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

Entonces me encontré con npm install, esperando NPM para instalar los módulos y sus dependencias. El resultado fue decepcionante:

[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] 

Estoy confundido por esto, ya que sé que express necesidades jade (y mucho más), y mongoose necesidades mongodb.
Si entro en node_modules/jade y corro npm install, el resultado del árbol principal es muy diferente:

[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] 

Así, express tiene crecido mucho. Parece que npm install solo está cargando algunas de las dependencias de los submódulos.

¿Alguien puede arrojar algo de luz sobre esto? ¿Por qué faltan algunas dependencias? ¿Estoy haciendo algo mal? (probable)

Gracias!

Merc.

Respuesta

7

La respuesta fue proporcionado por Brandon en un comentario a otra respuesta:

"Otra cosa a tener en cuenta es que si un paquete depende de un módulo que se puede resolver más arriba en la cadena de dependencia, lo hará para. ejemplo, ya que tiene mongodb en su paquete.json, Mongoose no necesita instalar su propio mongodb. - Brandon Tilley hace 2 días

Gracias Brandon! (Y esta es la respuesta ...)

38

Confunde al menos 2 puntos.

En primer lugar, expresar no depende de jade, como se puede ver leyendo el archivo 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": "*" 
    } 

Express no, sin embargo, funciona con de jade si está disponible, así como muchos otros motores de plantilla. Entonces, para arreglar esta lista jade como una dependencia en su archivo package.json, estará bien.

En segundo lugar, npm solo instala paquetes de nodo, no cosas de terceros como mongodb. Debe instalar mongodb y otras dependencias que no sean módulos npm utilizando otros medios (apt-get, yum, instalación manual, etc.).

Así que npm HACE instalar las dependencias recursivamente, pero solo los módulos npm.

+1

Otra cosa a tener en cuenta es que si un paquete depende de un módulo que se puede resolver más arriba en la cadena de la dependencia, lo hará. Por ejemplo, dado que tiene 'mongodb' en su paquete.json, Mongoose no necesita instalar su propio' mongodb'. –

+0

Brandon, esta * es * la respuesta. Acabo de descubrirlo no hace mucho tiempo. Básicamente, no instala MongoDb en Mongoose porque se resuelve más adelante. Como esta * es * la respuesta real, ¿puede agregarla como una respuesta adecuada, en lugar de un comentario, para poder aceptarla? – Merc

+0

@Peter Buen punto, las aplicaciones * generadas * por expreso tendrán sin embargo expresarse como una dependencia por cierto. Mi pregunta, "¿por qué faltan algunas dependencias?", Tiene la respuesta simple (proporcionada por Brandon) "Faltan porque se resuelven más adelante en el árbol de la dependencia". ¡Gracias! – Merc

4

uso de esta muestra

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

 
}

Cuestiones relacionadas