nvm (node version manager)
La mejor forma de gestionar un ambiente de Node.js, con todas sus dependencias y paquetes de npm.
Github: https://github.com/creationix/nvm
¿Qué significa NVM?
NVM es el acrónimo de “Node Version Manager” o “Gestor de Versiones de Node”.
Permite instalar múltiples versiones de Node.js y npm en un mismo ambiente, dejando cada una completamente aislada de las otras. Sí, puedes tener Node v0.11 y v5.4 instaladas en tu equipo y ejecutar una u otra según lo necesites. Genial, ¿no?.
Requerimientos
Mi Sistema Operativo por preferencia es Ubuntu, una distribución de Linux. Todo este tutorial lo voy a llevar adelante sobre Ubuntu, pero puede funcionar bien para cualquier distribución Linux e Unix. Ubuntu, Debian, Fedora, MacOS, todos pueden seguir esta guía.
Lo primero que vamos a necesitar es:
curl: necesario para descargar el script de instalación.
build-essential: necesario en caso de que vayamos a compilar Node.js desde el código fuente.
libssl-dev: ídem build-essential.
git: necesario porque el script de instalación descarga NVM desde un repositorio en Github.
Instalando NVM
Primero, y antes que nada, debemos ir al repositorio de NVM en Github (clic para ir) y copiar la línea del instalador. A fecha de hoy, Domingo 29 de Junio de 2014, el instalador nos permite instalar la versión 0.10 de NVM. Es recomendable que vayas al repositorio y obtengas la última versión disponible.
curl https://raw.githubusercontent.com/creationix/nvm/v0.10.0/install.sh | sh
¡ATENCIÓN!
A todos los usuarios de Ubuntu, principalmente: mucho cuidado al copiar instaladores de internet. Algunos caemos en este asunto de que mandamos sh a algún script de terceros. ¿Y el problema de esto? Muchos desarrolladores asumen que en todos los sistemas operativos, sh es alias de bash. Grave error. En Ubuntu, sh es alias de dash, una shell completamente diferente. ¿No me crees? Ejecuta:
you@yourcomputer:~$ readlink /bin/sh
dash
a. Vemos ahora que el script de instalación depende de bash para ejecutarse, pero le encarga la tarea a sh (que es dash). ¿Cómo lo solucionamos? Fácil, reemplazamos sh por bash y ya estamos listos.
Antes de continuar, tenemos que configurar el archivo de perfil de nuestra shell, necesario para que NVM se cargue a nuestro entorno. Si usamos Bash, nuestro archivo de perfil es ~/.bashrc, si usamos ZSH, ~/.zshrc. Yo uso bash en este tutorial, así que procedo como muestro a continuación:
a. Vemos ahora que el script de instalación depende de bash para ejecutarse, pero le encarga la tarea a sh (que es dash). ¿Cómo lo solucionamos? Fácil, reemplazamos sh por bash y ya estamos listos smile.
Antes de continuar, tenemos que configurar el archivo de perfil de nuestra shell, necesario para que NVM se cargue a nuestro entorno. Si usamos Bash, nuestro archivo de perfil es ~/.bashrc, si usamos ZSH, ~/.zshrc. Yo uso bash en este tutorial, así que procedo como muestro a continuación:
you@yourcomputer:~$ curl https://raw.githubusercontent.com/creationix/nvm/v0.10.0/install.sh | PROFILE=~/.bashrc bash
Una vez terminada la instalación, cerrar la terminal y volver a abrirla.
Primeros pasos con NVM
Si la instalación fue exitosa, al ejecutar nvm en nuestro terminal veremos el listado de comandos disponibles.
En este tutorial vamos a ver:
nvm install: nos permite descargar e instalar una nueva versión de Node.js junto con npm.
nvm use: permite cambiar de una versión a otra.
nvm run: ejecuta una versión de node.
nvm ls: muestra las versiones instaladas en nuestro ambiente.
nvm ls-remote: muestra las versiones disponibles para descargar desde un servidor remoto
Buscando una versión para instalar
Ejecutando nvm ls-remote nos mostrará un listado de versiones listas para instalar. A día de hoy, 29 de Junio de 2014, la última versión disponible es la v0.11.13. Para instalar esta versión, podemos ejecutar un comando de dos formas diferentes. Mucha atención:
you@yourcomputer:~$ nvm install v0.11.13
Instalando una segunda versión de Node
Hasta ahora, nada de lo que mostré parece ser sobresaliente si se compara con una instalación común y corriente de Node. La ventaja principal a la hora de usar NVM es poder instalar múltiples versiones de esta aplicación. Así que ahora vamos a probar los mismos pasos anteriores, pero con la versión v0.10.26:
you@yourcomputer:~$ nvm install v0.10.26
Podemos comprobar que tenemos las dos versiones instaladas, si ejecutamos:
you@yourcomputer:~$ nvm ls
Bloqueando versiones de Node.js en diferentes proyectos
Otra cosa muy interesante que tiene NVM es la posibilidad de “bloquear” una versión de Node.js en algún directorio, por ejemplo, el directorio de uno de nuestros proyectos. Este bloqueo lo realiza valiendose de un dotfile de nombre .nvmrc cuyo contenido es únicamente una versión de Node.js. De esta manera, cuando ejecutamos Node en un directorio donde existe un .nvmrc, se ejecutará la versión especificada en este archivo.
¡Atención!
Este dotfile sólo se tiene en cuenta si ejecutamos Node a través de NVM, con el comando nvm run. Veamos un ejemplo:
Creamos el siguiente archivo en un directorio cualquiera.
.nvmrc
1. v0.10.26
Creamos un archivo para probar la versión de Node en uso, en el mismo directorio que el dotfile
test-dotfile.js
1. console.log('Versión de node que se ejecuta: ', process.version);
2. process.exit(0);
Comprobamos que la versión de Node en uso es diferente a la versión del .nvmrc
you@yourcomputer:~$ nvm ls
v0.10.26
-> v0.11.13
you@yourcomputer:~/tutorial-nvm/prueba-dotfile$ nvm run test-dotfile.js
Found '/home/you/tutorial-nvm/prueba-dotfile/.nvmrc' with version <v0.10.26>
Running node v0.10.26
Versión que se ejecuta: v0.10.26
Más y más ventajas de NVM
¿Alguna vez has utilizado npm con sudo, como cuando haces una instalación global? ¿sudo npm install -g modulo te suena familiar? Esta forma de usar npm con sudo es algo feo. Y cuando digo feo, va en serio.
Hace unos meses, mientras hacía un update (sudo npm update -g), algo falló y todo mi directorio de módulos globales quedó horriblemente corrupto. ¿Por qué pasó esto? Aun no lo sé con certeza. En una instalación normal de Node.js en Ubuntu, los paquetes globales de npm van a parar a /usr/local/lib/node_modules/ y si revisamos los permisos de este directorio, vamos a ver que sólo se puede escribir por root. Es por eso que necesitamos usar npm como superusuario.
Pueden leer más acerca de este error por acá.
NVM es un mundo aparte en cuanto al tipo de organización de los directorios de binarios y módulos globales. Todas las versiones que vayamos a instalar con nvm install se guardarán en el directorio ~/.nvm/{versión}/. Cada directorio de estos contiene varios archivos y subdirectorios, pero los que nos interesan son:
bin/: directorio con los binarios de node y scripts ejecutables globales (como npm).
lib/node_modules/: directorio de módulos globales para esta versión.
Como ven, cuando hacen npm install -g en una instalación con NVM, estos módulos globales se guardan en el directorio de la versión en uso de Node, en el home del usuario. Ya no más sudo smile.
Hagamos una prueba:
you@yourcomputer:~$ npm install -g underscore
Una vez instalado, chequeamos la versión y nos fijamos si existe el módulo en el directorio que corresponde:
you@yourcomputer:~$ nvm ls
v0.10.26
-> v0.11.13
you@yourcomputer:~$ ls ~/.nvm/v0.11.13/lib/node_modules
npm underscore
Ahora vamos a chequear node_modules de la otra versión:
you@yourcomputer:~$ ls ~/.nvm/v0.10.26/lib/node_modules
npm
¿Qué hacemos si instalamos 50 paquetes en una versión y luego nos cambiamos a otra? ¿Tenemos que volver a instalar a mano todo? ¿Copiamos el directorio? Nada de eso. Sigamos y les muestro el último comando en este tutorial.
Migrando módulos de una versión a otra
Por suerte, previendo un escenario como el que planteé recién, los desarrolladores de NVM nos proveen un comando para hacer estas migraciones: nvm copy-packages.
Su uso es muy sencillo, sólo basta con pasarle como parámetro la versión desde la cual se quieren copiar los módulos HACIA la versión en uso. Veamos:
you@yourcomputer:~$ nvm ls
v0.10.26
-> v0.11.13
you@yourcomputer:~$ nvm use v0.10.26
Now using node v0.10.26
you@yourcomputer:~$ nvm copy-packages v0.11.13
you@yourcomputer:~$
NVM en grandes proyectos, o por qué puedes confiar en él
A estas alturas, seguro que ya te he vendido NVM y lo tienes instalado hasta en tu Raspberry Pi, ¿no? ¿Pero qué hay de la madurez de esta utilidad? ¿Se puede confiar de la misma en un ambiente delicado como Producción? La respuesta es: sí.

Publicar un comentario