npm, el gestor de paquetes de Node.js, se ha convertido con el tiempo en una herramienta absolutamente indispensable para cualquier desarrollador Web, especialmente para desarrolladores Front-End y, obviamente, para los que usen Node.js para el backend. A través de este gestor de paquetes y automatizador de scripts es posible instalar todo tipo de utilidades y herramientas, y es la base del tooling moderno utilizado para desarrollar (desde minimizar archivos hasta crear complejos procesos de automatización y bundling).

Conviene tener siempre la versión más reciente de la herramienta, por lo que de vez en cuando debemos actualizarlo. Si descargamos el instalador de la última versión de Node.js ya vendrá incluido, pero ¿y si, como ocurre muchas veces, solo queremos actualizar el propio npm pero no la versión de node?

Dado que npm es a su vez un paquete npm, en teoría deberíamos poder actualizarlo como cualquier otro paquete, usando el comando:

npm update -g npm

Pero esto no siempre funciona como esperábamos en Windows. El motivo es que, bajo Windows, Node.js se instala en la carpeta C:\Program Files\Nodejs e incluye también la versión "de serie" de su versión para npm, como se puede observar en esta figura:

que en realidad apunta a un código que está dentro de la carpeta node_modules de la instalación de Node.js.

Pero cuando actualizas un paquete npm con la instrucción vista más arriba, lo que hace es actualizar el paquete en la carpeta propia del usuario, en C:\Users\<usuario>\AppData\Roaming\npm, de modo que aunque la instalación de Node.js sea global, cada usuario puede manejar sus propios paquetes sin interferir con los demás.

El conflicto viene de que, cuando se instalar Node.js en el sistema, una de las opciones a añadir al PATH de Windows ambas carpetas: la de instalación de Node.js y la de los paquetes de npm:

Pero la ruta de los paquetes se instala en el PATH de usuario, y la de Node.js se instala en el PATH del sistema:

Rutas de Node en PATH

Y esto provoca un conflicto, pues el PATH del sistema siempre tiene preferencia frente al del usuario (al contrario que las demás variables de entorno, pero PATH es especial en esto). Por ello, cuando actualizas npm (guardándose la nueva versión en la ruta de los paquetes npm, del usuario), el efecto práctico es que el sistema no encuentra la nueva versión, puesto que encuentra antes el npm original que está en la carpeta de instalación de Node.js, y que venía con éste.

¿Cómo podemos solucionarlo?

Bueno, existen diversas maneras.

La primera y más sencilla sería eliminar la versión original de npm que viene con Node.js, pero no sin antes haber actualizado npm de la manera indicada al principio. Serían los dos archivos recuadrados más arriba. El problema de hacer esto es que si alguien más utiliza Node en la misma máquina y no lo ha actualizado lo dejaremos automáticamente sin el gestor de paquetes. Yo pienso que mejor no tocar los archivos originales si podemos encontrar otra solución.

La otra solución pasa por actualizar npm directamente en la carpeta original, lo cual par hacerlo bien implica una serie de pasos un tanto tediosos y que están descritos en la documentación de npm.

Para evitar tener que pasar el mal trago, como no, existe un paquete npm que nos soluciona el problema. Se trata de npm-windows-upgrade. Lo escribió el programador Alemán Félix Rieseberg cuando trabajaba en Microsoft (ahora está en Slack).

Para poder utilizarlo necesitaremos abrir una ventana de PowerShell como administrador:

Una vez en PowerShell debemos asegurarnos de que podemos ejecutar scripts de PowerShell, que por defecto vienen "capados", escribiendo esto:

Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force

Ahora ya podemos proceder. Lo único que necesitamos es instalar el paquete npm mencionado:

npm install -g npm-windows-upgrade

¡Listo! Ahora ya podemos usar esta herramienta para actualizar npm a la versión que queramos:

En la figura anterior se ve cómo compruebo la versión actual de npm (sale la 5.0.3) y cuando lanzo el actualizador me indica las versiones disponibles, a través de la cuales me puedo mover. La más reciente es la 5.2.0, que es la que escojo y pulso ENTER para instalarla. Al cabo de un rato (más largo que lo que muestra el GIF, que he acelerado en la parte de la instalación), npm queda actualizado directamente en la carpeta de Node.js.

Esta herramienta, que parece un tanto rebuscada, de hecho es tan efectiva que ahora ya es el método que recomienda el propio Node.js en la documentación para actualizar npm en Windows. Así que no hay problema por hacerlo así.

¡Espero que te haya ayudado!

Escrito por un humano, no por una IA