Me encanta Bundler , es excelente para la gestión de dependencias. Me encanta npm , ¡instalar paquetes de nodos es fácil! Tengo una aplicación nodejs y me encantaría poder especificar las dependencias de mis aplicaciones e instalarlas / actualizarlas fácilmente donde sea que implemente mi aplicación. Esta no es una biblioteca que estoy lanzando, es una aplicación web completa.
Soy consciente del npm bundle
comando, pero parece que simplemente anula el directorio donde están instalados los paquetes.
Estoy acostumbrado a usar bundler de esta manera:
# Gemfile
gem "rails", "3.0.3"
Instala rails v3.0.3 y cualquier otra gema requerida en la máquina host solo si aún no existe
> bundle install
¿Cómo puedo lograr algo similar con npm?
javascript
dependencies
node.js
bundler
npm
Daniel Beardsley
fuente
fuente
Respuestas:
A partir de npm 1.0 (que ahora es lo que obtiene de forma predeterminada si sigue los pasos en el archivo README), "paquete" ya no es una cosa separada, es simplemente "cómo funciona".
Entonces:
package.json
archivo en la raíz de tu proyectoEnumere sus departamentos en ese archivo
{ "name" : "my-project" , "version" : "1.0.0" , "dependencies" : { "express" : "1.0.0" } }
npm install
Como está llamando a esto sin argumentos, y no en modo global, simplemente instalará todos sus departamentos localmente.require("express")
y se feliz.fuente
your_app/node_modules
directorio local a un enlace simbólico fuera del directorio de su aplicación. No desea tener que descargar, compilar e instalar cada dependencia cada vez que implementa.my-project
en./node_modules/my-project/node_modules
. No estoy seguro de si existe una forma conveniente de instalar todas las dependencias en./node_modules
Anyone.Editar: esto solo se aplica a las versiones npm <1.0
Fue bastante difícil resolver esto, pero la NPM lo hace posible .
Necesitas tres componentes
deps/
)package.json
archivo en el directorio anterior que enumera las dependenciasindex.js
archivo en el directorio anterior que requiere sus dependenciasEjemplo
Imagina que express es tu única dependencia
deps / package.json
nota: Incremente el número de versión cada vez que modifique las dependencias
{ "name": "myapp_dependencies", "version": "0.0.1", "engines": { "node": "0.4.1" }, "dependencies":{ "express": "2.0.0beta2" } }
deps / index.js
export.modules = { express: require('express') //add more }
Ahora debería poder instalar sus dependencias usando npm. Incluso podría hacer que esto sea parte de su proceso de implementación
Luego, dentro del código de su aplicación, puede obtener acceso a su versión específica de express de esta manera:
var express = require('myapp_dependencies').express;
fuente
require('express')
importaría in deps / index.js la última versión express, y no necesariamente la que instalamos? Soy un novato de nodeJS así que por favor tengan paciencia conmigo.npm install
, agrega enlaces simbólicos dentro del directorio de su paquete instalado a las versiones correctas de los paquetes dependientes. Cuando se requiere su paquete de dependencias,require('express')
primero verifica el directorio local y encuentra el enlace simbólico a la versión correcta de express.Debería leer estos dos artículos del blog Isaacs (autor npm). Creo que son realmente buenos, y creo que te dirán cómo lograr tu objetivo:
Creo que el enlace n. ° 1 (punto n. ° 11) explica esto:
fuente
npm bundle
se utiliza para recopilar todas sus dependencias en un directorio específico que no sea el predeterminado. Probablemente se me ocurrirá mi propia solución que funcione de manera similar abundle install
(bundler
para ruby)npm
versión 1.0+,npm bundle
se ha eliminado. En su lugar, use elnpm install
comando sin nombre de paquete, leerá package.json y desplegará los paquetes requeridos.A partir de la versión 1.1.2 de Npm, hay un nuevo comando
npm shrinkwrap
que crea unnpm-shrinkwrapped.json
archivo, análogo aGemfile.lock
. Es importante hacer uno para evitar que el software se pudra (consulte la justificación de Bundler ). Particularmente porque Nodejs tiene una comunidad que se mueve tan rápido.Aunque
bundle install
crea unGemfile.lock
automáticamente,npm install
no lo crearánpm-shrinkwrapped.json
(pero lo usará cuando exista). Por lo tanto, debe recordar usarnpm shrinkwrap
.Lea una guía completa en http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap/
fuente
Me parece que la solución más simple es usar un
package.json
archivo con elprivate
indicador (agregado a npm el mes pasado) configurado entrue
. De esa manera, puedes corrernpm install
onpm bundle
tomar las dependencias de su proyecto, pero evita que alguien publique accidentalmente su proyecto no público.He aquí un ejemplo
package.json
:{ "name": "yourProject" ,"version": "1.0.0" ,"dependencies": { "express" : ">=2.1.0" } ,"private": true }
La ejecución
npm install
se instalaráexpress
en el sistema local si aún no existe; corriendonpm publish
da un error debido a la"private": true
.Usted y su equipo pueden usar la etiqueta de versión internamente para realizar un seguimiento de los cambios de dependencia a lo largo del tiempo; cada vez que cambie una dependencia, aumente la versión. Para ver qué versión ha instalado, use
npm ls installed
.fuente
true
y que solo funciona porque las cadenas son valores veraces (es decir,!!"false" === true
).Publica tu aplicación con
npm
también y enumere sus dependencias en su archivo package.json.Cuando alguien lo utilice
npm
para instalar su paquete,npm
se encargará de resolver sus dependencias.Especificaciones de paquetes: http://wiki.commonjs.org/wiki/Packages/1.0
fuente
npm
para instalar antes de instalar su aplicación. No creo que haya ningún otrogem
equivalente para node.js.