Uso de npm para instalar o actualizar paquetes requeridos al igual que bundler para rubygems


Me encanta Bundler, es genial en la gestión de dependencias. Me encanta npm , instalar paquetes de nodos es fácil! Tengo una aplicación nodejs y me encantaría ser capaz de especificar las dependencias de mis aplicaciones e instalarlas / actualizarlas fácilmente dondequiera que despliegue mi aplicación. Esta no es una biblioteca que estoy lanzando, es una aplicación web de pleno derecho.

Soy consciente de la orden npm bundle, pero parece que simplemente anula el directorio donde se instalan los paquetes.

Estoy acostumbrado a usar bundler de esta manera:

# Gemfile
gem "rails", "3.0.3"

Instala rails v3.0. 3 y cualquier otra joya requerida en la máquina host solo si no existe

> bundle install

¿Cómo puedo lograr algo similar con npm?

Author: glebm, 2011-02-02

6 answers

A partir de npm 1.0 (que ahora es lo que obtienes por defecto si sigues los pasos en el archivo README), "bundle" ya no es una cosa segregada it es solo "cómo funciona".

Así que:

  1. Ponga un archivo package.json en la raíz de su proyecto
  2. Enumere sus deps en ese archivo

    { "name" : "my-project"
    , "version" : "1.0.0"
    , "dependencies" : { "express" : "1.0.0" } }
    
  3. npm install Ya que estás llamando a esto sin args, y no en modo global, simplemente instalará todos tus deps localmente.

  4. require("express") y ser feliz.
 142
Author: isaacs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-18 19:00:25

Editar: Esto solo se aplica a las versiones de npm

Fue bastante difícil entender esto, pero El MNP lo hace posible.

Se necesitan tres componentes

  1. Un subdirectorio en su repositorio (es decir, deps/)
  2. Un archivo package.json en el directorio anterior que enumera las dependencias
  3. Un archivo index.js en el directorio anterior que requiere sus dependencias

Ejemplo

Imagine que express es su solo dependencia

Deps/package.json

nota: Incrementa la versión # cada vez que modifiques 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

cd deps
npm install

Luego, dentro del código de su aplicación, puede obtener acceso a su versión específica de express de la siguiente manera:

var express = require('myapp_dependencies').express;
 10
Author: Daniel Beardsley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-22 09:28:20

Deberías leer estos dos artículos del blog Isaacs(autor npm). Creo que son muy buenos, y creo que le dicen cómo lograr su objetivo:

  1. http://blog.izs.me/post/1675072029/10-cool-things-you-probably-didnt-realize-npm-could-do
  2. http://foohack.com/2010/08/intro-to-npm/

Creo que el enlace #1 (punto #11) explica esto:

11: Agrupa todas tus dependencias en el propio paquete

Cuando se usa el comando npm bundle, npm pondrá todo sus dependencias en el carpeta node_modules en su paquete. Pero no se detiene ahí.

Si quieres depender de algo eso no está en el registro, usted puede hacer que. Solo haz esto:

Instalación del paquete Npm http://github.com/whoever/whatever/tarball/master Esto instalará el contenido de ese tarball en el paquete, y luego usted puede listarlo como una dependencia, y no intentaré instalarlo cuando su el paquete se instala.

Esto también es útil si tiene su propio tenedor de algo, y lo haría prefiero no cambiar el nombre.

De hecho, puede ejecutar casi cualquier npm comando en el paquete. Para ver lo que es dentro, puedes hacer npm bundle ls. A eliminar algo, hacer npm paquete rm cosa. Y, por supuesto, puede instalar múltiples versiones y activar el uno tú quieres.

 5
Author: Alfred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-02 12:39:05

A partir de la versión 1.1.2 de Npm, hay un nuevo comando npm shrinkwrap que crea un archivo npm-shrinkwrapped.json, análogo a Gemfile.lock. Es importante hacer uno, para evitar que el software se pudra (ver justificación de Bundler). Particularmente como Nodejs tiene una comunidad que se mueve tan rápido.

Mientras que bundle install crea un Gemfile.lock automáticamente, npm install no creará npm-shrinkwrapped.json (pero lo usará cuando exista). Por lo tanto, debe recordar usar npm shrinkwrap.

Lea una guía completa en http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap /

 2
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-29 12:45:16

Me parece que la solución más simple es usar un archivo package.json con la bandera private (agregada a npm el mes pasado) establecida en true. De esta manera, puede ejecutar npm install o npm bundle para capturar las dependencias de su proyecto, pero evita que nadie publique accidentalmente su proyecto no público.

Aquí hay un ejemplo package.json:

{
"name": "yourProject"
,"version": "1.0.0"
,"dependencies": { "express" : ">=2.1.0" }
,"private": true
}

Ejecutando npm install instalará express en el sistema local si no existe ya; ejecutando npm publish da un error, debido a la "private": true.

Usted además, tu equipo puede usar la etiqueta de versión internamente para realizar un seguimiento de los cambios de dependencia a lo largo del tiempo; cada vez que cambies una dependencia, cambia la versión. Para ver qué versión has instalado, usa npm ls installed.

 2
Author: Trevor Burnham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-20 17:18:11

Publica tu app con npm también, y lista sus dependencias en tu paquete.archivo json.

Cuando alguien usa npm para instalar su paquete, npm se encargará de resolver sus dependencias.

Especificación de paquetes: http://wiki.commonjs.org/wiki/Packages/1.0

 1
Author: Dan Grossman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-02 07:52:27