Tienes un cupón activo hasta el . Ver tu oferta

¿Qué es un "Gestor de versiones"?

Cómo gestionar las versiones de los lenguajes

Describimos un programa diseñado para gestionar las versiones de los lenguajes. Con él, puedes instalar las versiones necesarias y cambiar entre ellas.

Instalación del sistema

Para ejecutar código en cualquier lenguaje, es necesario instalar su intérprete (o compilador). En diferentes sistemas operativos, esto se hace de diferentes maneras, pues algunos utilizan gestores de paquetes como apt o yum, mientras que otros descargan un instalador. Algunos lenguajes ya vienen preinstalados, como Python, que está ampliamente integrado en las distribuciones de Linux.

# Ubuntu
sudo apt install nodejs # instalará una versión no tan reciente

El método estándar de instalación funciona bien solo al principio, durante la configuración inicial. Con el tiempo, comienzan a surgir diferentes problemas. Por ejemplo, en algún momento se lanza una nueva versión del lenguaje que se debe agregar al proyecto. Por lo general, lleva algún tiempo antes de que el lenguaje esté disponible para su instalación a través de los gestores de paquetes. Y aquí tienes dos opciones, que son esperar, lo cual no siempre es deseable, o buscar otra forma de instalarlo. Esta última a menudo se convierte en un desafío serio, con horas de búsqueda en Google e instalación de bibliotecas adicionales. Todo esto termina por saturar el sistema y, a veces, incluso romperlo.

Otro problema importante es la instalación de múltiples versiones de un mismo lenguaje. Esto es necesario cuando un desarrollador cambia entre diferentes proyectos que requieren diferentes versiones. ¿Con qué frecuencia ocurre esto? Muy a menudo. Cuanto más avanzada es la etapa de desarrollo, más opciones hay, como diferentes proyectos en la empresa, proyectos propios, proyectos de código abierto.

Es importante mencionar que todo esto no se aplica a aquellos que utilizan Docker y Docker Compose. Sin embargo, incluso en este caso, se necesitan lenguajes para trabajar con el código abierto.

Gestores de versiones

Para resolver estos problemas, los desarrolladores han ideado gestores de versiones. Un gestor de versiones es un programa especial diseñado para gestionar las versiones de un lenguaje. Con él, puedes instalar las versiones necesarias y cambiar entre ellas. A diferencia de los gestores de paquetes integrados en los sistemas operativos, los gestores de versiones siempre permiten instalar las últimas versiones de los lenguajes tan pronto como se lanzan (incluyendo versiones alfa y beta).

Por ejemplo, para Node.js existe NVM (Node Version Manager).

# Instalación de NVM
# (consulta en el README del proyecto cuál es la versión más reciente del instalador, aquí v0.40.8)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh | bash
# La instalación no implica la activación. Después de la instalación, la versión activa seguirá siendo la misma que antes de la instalación
nvm install node # Instalar la última versión disponible de Node.js
nvm install --lts # Instalar la última versión LTS (soporte a largo plazo)
nvm install 22 # o 24, 22.11.0, etc.
nvm ls-remote # lista de versiones disponibles
nvm use node # Activar la última versión instalada de Node.js
nvm use 22 # Activar la versión deseada (nvm use recibe un solo argumento)

Para facilitar el trabajo, los gestores de versiones suelen permitir crear un archivo especial dentro del proyecto que registra la versión deseada del lenguaje. En algunos casos, los gestores de versiones rastrean automáticamente este archivo y cambian la versión automáticamente.

echo "22" > .nvmrc # también puedes escribir lts/* para usar siempre la última LTS
# Este comando detecta el archivo .nvmrc y utiliza la versión especificada allí
$ nvm use
Found '/path/to/project/.nvmrc' with version <22>
Now using node v22.x.x

En el mundo moderno, es difícil imaginar un lenguaje que no tenga un gestor de versiones. Además, algunos lenguajes, como Ruby, tienen múltiples gestores de versiones que compiten entre sí. Estos son algunos ejemplos, sin pretensión de ser una lista exhaustiva.

  • go (gvm, g)
  • java (SDKMAN)
  • ruby (rbenv, rvm, chruby)
  • php (phpenv, phpbrew)
  • python (pyenv, uv)
  • node (nvm, fnm)

Los gestores de versiones han resuelto varios problemas importantes. Por lo general, cuando un programador interactúa con un lenguaje instalado directamente, tiene que usar sudo para instalar paquetes globales. Esto se debe a que el esquema de instalación estándar del lenguaje está diseñado para todos los usuarios a la vez. Por lo tanto, todos los archivos necesarios, incluidos los paquetes globales, se colocan en directorios compartidos que requieren permisos de administrador. Desde el punto de vista de la seguridad, esto es un agujero bastante grande que los desarrolladores de bibliotecas de código abierto pueden (y a veces lo hacen) aprovechar. Los gestores de versiones instalan todo en el directorio de inicio del usuario actual, donde ya tiene todos los permisos. Por un lado, esto evita la necesidad de ejecutar la instalación de paquetes en nombre del administrador, y por otro lado, no se satura el sistema. Eliminar un lenguaje y todos sus paquetes a través del gestor de versiones es extremadamente fácil. Basta con borrar el directorio (aunque es mejor hacerlo a través del propio gestor de versiones).

Gestor universal

Al resolver algunos problemas, los gestores de versiones han creado otros. En primer lugar, hay demasiados de ellos y a veces cambian, pues uno se vuelve popular y luego otro. En segundo lugar, el proceso de instalación del gestor de versiones puede ser más complicado que la instalación del lenguaje en sí. El problema es que deben ser universales y funcionar en todas partes, lo cual es extremadamente difícil dada la diversidad de los ecosistemas modernos. Basta con echar un vistazo a la documentación de NVM para darse cuenta de la magnitud del desastre. En tercer lugar, todos estos gestores funcionan de manera diferente y tienen comandos diferentes. Esto complica el proceso de cambiar entre ellos al trabajar con diferentes lenguajes.

Todo esto llevó al siguiente paso lógico. Finalmente, apareció un gestor universal llamado asdf, que, gracias a los complementos, puede trabajar con cualquier lenguaje. Estas son algunas de sus ventajas, sin ser una lista completa.

  • Una sola utilidad de línea de comandos para trabajar con todos los lenguajes
  • Una interfaz de interacción unificada para todos los lenguajes
  • Cambio automático a la versión necesaria del lenguaje dentro de cada proyecto
  • Un sistema de complementos sencillo que permite agregar cualquier lenguaje

asdf no es el único gestor universal. Otra opción es mise, que lee el archivo .tool-versions de asdf y además puede leer archivos como .nvmrc o .python-version; también permite definir variables de entorno y tareas del proyecto. Para ciertos lenguajes existen además herramientas especializadas, como uv para Python. Cuál elegir depende de tu caso. Si trabajas con varios lenguajes y quieres una sola herramienta, un gestor universal como asdf o mise simplifica todo el proceso. Si trabajas con un solo lenguaje, suele bastar el gestor propio de ese lenguaje. asdf tiene un sistema de comandos un poco más complejo debido a la necesidad de admitir múltiples lenguajes.

# asdf tiene una excelente documentación que muestra claramente cómo instalarlo
# y qué dependencias pueden ser necesarias en diferentes sistemas

# Instalación (asdf se distribuye como un binario único; el método recomendado es un gestor de paquetes)
brew install asdf
# También puedes descargar el binario desde https://github.com/asdf-vm/asdf/releases
# y colocarlo en una carpeta incluida en tu $PATH

# Agrega los "shims" de asdf al PATH (para bash o zsh; ajusta según tu shell)
echo 'export PATH="${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH"' >> ~/.bashrc

# Activa los cambios realizados
source ~/.bashrc

# Para trabajar con un lenguaje específico, primero debes agregar el complemento correspondiente
# La lista de complementos disponibles se encuentra en el sitio web del proyecto
asdf plugin add nodejs

# Instalación del lenguaje
# En lugar de nodejs, debes usar el nombre del complemento con el que estás trabajando
asdf install nodejs latest # latest significa la última versión del lenguaje especificado

# Instalación de una versión específica
asdf install nodejs 22.11.0

# Establecer una versión específica del lenguaje como la versión predeterminada del usuario
# (en versiones antiguas de asdf este comando era "asdf global")
asdf set -u nodejs 22.11.0

# Sin -u, la versión se fija solo para la carpeta actual (archivo .tool-versions)
asdf set nodejs 22.11.0

# Muestra las versiones actuales de los lenguajes instalados a través de asdf
asdf current
# (los números de versión son un ejemplo; verás los que tengas instalados)
nodejs         22.11.0  (set by /Users/user/.tool-versions)
python         3.12.7   (set by /Users/user/.tool-versions)
ruby           3.3.5    (set by /Users/user/.tool-versions)

Conclusión

Trabajar con diferentes versiones de lenguajes es una tarea complicada que los gestores de versiones y Docker (para usuarios avanzados) resuelven. Entre los gestores universales, asdf y mise permiten gestionar con una sola herramienta varios lenguajes e incluso programas regulares; para un solo lenguaje, su gestor específico (nvm, pyenv, uv, SDKMAN) también es una buena opción.

Para seguir aprendiendo

Leer otros artículos de Guías

Lea otros artículos relevantes del mundo de la tecnología y el espíritu empresarial.

Herramientas y entorno

Por qué usar Vim

VI(M) es un editor de texto que apareció en 1991 y todavía es muy popular (junto con Emacs). Por lo general, los desarrolladores experimentados lo eligen después de usar otros editores.

Actualizado el

Herramientas y entorno

Cómo configurar VS Code para desarrollar en PHP

Visual Studio Code es un popular editor de código gratuito. Puede competir fácilmente con PhpStorm, ya que es gratuito y de código abierto.

Actualizado el

Herramientas y entorno

Cómo aprender a usar a ciegas el teclado

¿Por qué los desarrolladores necesitan escribir a ciegas? Compartimos opiniones y consejos sobre cómo escribir rápido y sin errores

Actualizado el

Todas las guías