npm install vs. update: ¿cuál es la diferencia?

520

¿Cuál es la diferencia práctica entre npm instally npm update? ¿Cuándo debo usar cuál?

Borek Bernard
fuente

Respuestas:

655

La diferencia entre la instalación de npm y el manejo de actualizaciones de npm de las versiones de paquete especificadas en package.json :

{
  "name":          "my-project",
  "version":       "1.0",                             // install   update
  "dependencies":  {                                  // ------------------
    "already-installed-versionless-module":  "*",     // ignores   "1.0" -> "1.1"
    "already-installed-semver-module":       "^1.4.3" // ignores   "1.4.3" -> "1.5.2"
    "already-installed-versioned-module":    "3.4.1"  // ignores   ignores
    "not-yet-installed-versionless-module":  "*",     // installs  installs
    "not-yet-installed-semver-module":       "^4.2.1" // installs  installs
    "not-yet-installed-versioned-module":    "2.7.8"  // installs  installs
  }
}

Resumen : La única gran diferencia es que un módulo ya instalado con versiones difusas ...

  • es ignorado por npm install
  • se actualiza por npm update

Además : instally updatepor defecto maneja las DevDependencies de manera diferente

  • npm installse instale / actualice devDependencies menos que --productionse añade la bandera
  • npm updatese ignorar devDependencies a menos que --devse añade la bandera

¿Por qué usar npm installen absoluto?

Porque npm installhace más cuando miras además de manejar tus dependencias package.json. Como puede ver en npm install , puede ...

  • instalar manualmente módulos de nodo
  • configúrelos como globales (lo que los coloca en el shell PATH) usandonpm install -g <name>
  • instalar ciertas versiones descritas por las etiquetas git
  • instalar desde una URL de git
  • forzar una reinstalación con --force
xanderiel
fuente
20
y ¿qué pasa ~1.3?
Offirmo
66
¿Qué pasa si la versión es como ^ 5.0.9? ¿Y es posible hacer npm install --save somePackageguardar el * en dependencias?
KwiZ
55
También me gustaría señalar que los scripts se postinstallejecutan en la instalación, pero no en la actualización.
Michael Marvick
2
Si instally updatefunciona de manera diferente en URL de git, etiquetas de git, etc., especificadas en el, package.jsonentonces sería genial agregar esos casos al ejemplo.
joeytwiddle
2
@Offirmo la tilde en las versiones difusas significa "actualizar a la última versión menor (corrección de errores) de este paquete", siendo la versión menor el último número de la versión, es decir, esto 1.3.0 -> 1.3.1es similar a ^1.3.0, donde las ^actualizaciones son la versión principal, es decir 1.3.0 -> 1.4.0.
Boyan Kushlev
82

npm install instala todos los módulos que figuran en el package.jsonarchivo y sus dependencias.

npm update actualiza todos los paquetes en el node_modulesdirectorio y sus dependencias.

npm install express instala solo el módulo express y sus dependencias.

npm update express actualiza el módulo express (comenzando con [email protected], no actualiza sus dependencias).

Entonces, las actualizaciones son para cuando ya tiene el módulo y desea obtener la nueva versión.

Saeed
fuente
55
Si no especifica una versión en particular en un archivo package.json, npm install obtendrá la última versión de un módulo. Así que esto es una especie de actualización.
Saeed
11
Entonces, ¿qué debo usar npm installo npm update? O, en otras palabras, ahora estoy usando npm instally parece hacer la actualización también, ¿hay alguna razón por la que debería usar npm update?
Borek Bernard
44
Entonces, update¿siempre se actualizará a la última versión, independientemente de package.json, mientras installse respetará la versión dada en package.json?
Borek Bernard
1
updateinstala (o actualiza) la última versión del módulo. installinstala la última versión del módulo si no se presenta, de lo contrario conserva la versión actual.
tenphi
11
@Borek npm updatese actualizará a la última versión basada en su package.json, no sin importarlo. Si tiene "express": "3.x" y está en la versión 3.1.0, se actualizará a la última etiqueta 3.x. Si hay una versión 4.x, no instalará la última.
gcochard
47

En la mayoría de los casos, esto instalará la última versión del módulo publicada en npm.

npm install express --save

o mejor para actualizar el módulo a la última versión utilizada:

npm install express@latest --save --force

--save: El paquete aparecerá en sus dependencias.

Más información: npm-install

jmav
fuente
11
npm install express@latest --save --forceEra exactamente lo que quería.
ThomasReggi
2
¿En la mayoría de los casos? ¿Algún otro caso?
Dmitri Zaitsev
9

Ya se han mencionado muchas distinciones. Aquí hay uno más:

Correr npm installen la parte superior de su directorio de origen se ejecutará varios guiones: prepublish, preinstall, install, postinstall. Dependiendo de lo que hagan estos scripts, a npm installpuede hacer mucho más trabajo que simplemente instalar dependencias.

Acabo de tener un caso de uso donde prepublishllamaría makey Makefilefue diseñado para buscar dependencias si package.jsonse actualiza. Llamar npm installdesde dentro Makefilehabría llevado a una recursión infinita, mientras que las llamadas npm updatefuncionaron bien, instalando todas las dependencias para que la compilación pudiera continuar incluso si makese llamó directamente.

MvG
fuente
1
Una implicación es que si actualizó, por ejemplo, su redismódulo y other_modulerequiere una versión anterior de redis, npm install other_modulegarantizará que other_moduleusará la versión anterior. Se puede agregar other_module/node_modules/redissi es necesario.
jlukanta
4

npm update: instalar y actualizar con los últimos módulos de nodo que se encuentran en package.json

npm install: instale módulos de nodo que se definen en package.json (sin actualización)

DSK
fuente
Usando npm versión 6.9.0, observo el siguiente comportamiento: npm updateomitirá una gran cantidad de dependencias en package-lock.json. Para tener todos los paquetes necesarios disponibles y package-lock.jsonser correctos, siempre tengo que ejecutarlos npm installinmediatamente después npm update.
Manfred