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 bundlecomando, 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.jsonarchivo 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 installComo 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_modulesdirectorio 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-projecten./node_modules/my-project/node_modules. No estoy seguro de si existe una forma conveniente de instalar todas las dependencias en./node_modulesAnyone.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.jsonarchivo en el directorio anterior que enumera las dependenciasindex.jsarchivo 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 bundlese 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(bundlerpara ruby)npmversión 1.0+,npm bundlese ha eliminado. En su lugar, use elnpm installcomando 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 shrinkwrapque crea unnpm-shrinkwrapped.jsonarchivo, 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 installcrea unGemfile.lockautomáticamente,npm installno 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.jsonarchivo con elprivateindicador (agregado a npm el mes pasado) configurado entrue. De esa manera, puedes corrernpm installonpm bundletomar 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 installse instalaráexpressen el sistema local si aún no existe; corriendonpm publishda 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
truey que solo funciona porque las cadenas son valores veraces (es decir,!!"false" === true).Publica tu aplicación con
npmtambién y enumere sus dependencias en su archivo package.json.Cuando alguien lo utilice
npmpara instalar su paquete,npmse encargará de resolver sus dependencias.Especificaciones de paquetes: http://wiki.commonjs.org/wiki/Packages/1.0
fuente
npmpara instalar antes de instalar su aplicación. No creo que haya ningún otrogemequivalente para node.js.