Actualiza todas las dependencias de un proyecto NodeJS a su última versión

Como puedes actualizar todas las dependencias npm del archivo package.json, a su última versión disponible?

Cuando instalas un paquete usando npm install <packagename>, la última versión del paquete es descargada y almacenada en la carpeta node_modules, y una entrada correspondiente es agregada a los archivos package.json y package-lock.json presentes en la carpeta actual.

NPM calcula las dependencias e instala las versiones más actuales disponibles de estas también.

Como ejemplo procedemos a instalar mongoose con npm install mongoose, esta entrada es agregada al archivo package.json:

1
2
3
4
5
{
"dependencies": {
"mongoose": "^5.8.9"
}
}

adicional el archivo package-lock.json es actualizado con las respectivas dependencias (las dependencias anidadas removidas por claridad):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"mongoose": {
"version": "5.8.9",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.8.9.tgz",
"integrity": "sha512-gRazoLTQ0yuv4bk2z+nZEarKCyJ7WilFBkgrRqpOczUZUhk3i/FCe0rp8Mjc87dGXaHx54j8AjPJ0UKqJDXWMA==",
"requires": {
"bson": "~1.1.1",
"kareem": "2.3.1",
"mongodb": "3.4.1",
"mongoose-legacy-pluralize": "1.0.2",
"mpath": "0.6.0",
"mquery": "3.2.2",
"ms": "2.1.2",
"regexp-clone": "1.0.0",
"safe-buffer": "5.1.2",
"sift": "7.0.1",
"sliced": "1.0.1"
},
"dependecies": {
...
}
}
}
}

Ahora estos 2 archivos nos dicen que hemos instalado la versión 5.8.9 de mongoose, y la regla para actualizaciones es ^5.8.9, que según las reglas de versionamiento de npm significa que se puede actualizar sólo parches y versiones menores: 5.9.0, 5.9.1 y así sucesivamente.

Pero esto no aplica para versiones mayores que pueden romper la compatibilidad, para este ejemplo 6.0.0 o mayor.

Si hay una actualización menor o parche y ejecutamos npm update, la versión instalada es actualizada, y el archivo package-lock.json será actualizado también con la nueva versión.

El archivo package.json permanece sin cambios.

Para descubrir nuevas versiones mayores, ejecutamos npm outdated. El comando mostrará la lista de paquetes desactualizados como vemos en este ejemplo:

npm outdated

Si la última versión es una versión mayor, ejecutar npm update no actualizará a esta versión. las versiones mayores nunca son actualizadas de esta manera porque (por definición) introduce cambios dañinos, y npm quiere evitar esto.

Para actualizar a una versión mayor todos los paquetes, instala el paquete npm-check-updates globalmente:

1
npm install -g npm-check-updates

luego ejecútalo:

1
ncu -u

Esto actualizará todas las dependencias a su última versión mayor en el archivo package.json, para poder instalarlas.

Ahora ejecuta la actualización:

1
npm update