top of page

🌳 La solución a prueba de futuro para gestionar tus versiones de Flutter: ¿global, FVM o asdf-vm?

¿Quieres probar la última versión de Flutter pero no quieres que tus proyectos existentes fallen? ¿Quieres tener un entorno consistente en todo el equipo de desarrollo? ¿Quieres blindar tu entorno de desarrollo para el futuro? Déjame mostrarte cómo...


Estas son las tres evoluciones distintas en la configuración de un entorno de desarrollo:




Gestiona distintas versiones de Flutter en un mismo equipo
Gestiona distintas versiones de Flutter en un mismo equipo

🌱 Trabajar con una versión de la herramienta

En este artículo, profundizaré en cada una y compararé sus pros y contras, y luego, analizaré cuál podría llevar a un entorno más protegido para el futuro. La mayoría de los desarrolladores de Flutter comienzan con la instalación estándar siguiendo la guía oficial de inicio de Flutter.dev. Esta guía instala la versión estable más reciente de Flutter en una ubicación de tu elección, así como todas las dependencias necesarias para ejecutar un proyecto. Puedes construir y ejecutar proyectos de Flutter con la misma versión, lo cual es suficiente para la mayoría de los desarrolladores. Los problemas comienzan cuando:


👯‍♀️ Empiezas a trabajar en equipo y quieres un entorno consistente

🙏 Empiezas a interesarte en contribuir a proyectos de código abierto que tienen diferentes versiones de Flutter

👴 Tienes proyectos existentes que dependen de versiones anteriores de Flutter

👋 Quieres probar una versión más nueva de Flutter


Estos problemas tienen un tema similar; la gestión de la única versión de Flutter. Puede que necesites cambiar a diferentes versiones basadas en la configuración de un proyecto en lugar de mantener una única versión. Muchos desarrolladores se quedan con la única versión global de Flutter y cambian usando los comandos a continuación:



# Upgrade your copy of Flutter
flutter upgrade

# Downgrade Flutter to the last active version for the current channel.
flutter downgrade

# List or switch Flutter channels.
flutter channel [master, stable, beta]

# When in your flutter install folder little bit more hands-on
git checkout [flutter build version]

Tener muchos proyectos con diferentes versiones puede ser problemático para controlar. Los métodos mencionados anteriormente requieren mucho esfuerzo para gestionar, y se tarda tiempo en cambiar. Necesitarás llevar un registro de en qué versión te encuentras y qué versión utiliza el proyecto que estás ejecutando.


Este método puede ser muy engorroso y torpe para cambiar. Sin embargo, podemos resolver estos problemas gestionando las versiones de manera más eficiente.


🌿 Trabajar con múltiples versiones de la herramienta

Gestionar las versiones de manera más eficiente es el segundo paso en la evolución del entorno de desarrollo. Usar un gestor de versiones permitirá una gestión eficiente de la versión de la herramienta. Pero, ¿qué es un gestor de versiones?


¿Qué es un Gestor de Versiones?

Casi todos los lenguajes y frameworks hoy en día tienen un gestor de versiones. Si has usado Ruby, podrías estar familiarizado con usar rvm, rbenv o frum para gestionar tus versiones, o si usas Node, tiene una lista similar; nvm, nodist y n. Un Gestor de Versiones es usualmente una herramienta CLI que típicamente controla:

  • La descarga y caché de las versiones de la herramienta

  • El mecanismo para permitir el cambio de versiones

  • Un medio para rastrear qué versión utiliza un proyecto

  • Características extras que el autor del Gestor de Versiones considera útiles para el desarrollador


Así que con un Gestor de Versiones, podrías cambiar fácilmente entre todas las versiones que quieras con facilidad. La mayoría lo hace alterando la variable de entorno PATH para agregar la ubicación de una versión específica de la herramienta. Algunos también usan enlaces simbólicos o shims para establecer la versión, pero hablaremos de eso más adelante. Para entender completamente su potencial, veamos la configuración y uso de un popular Gestor de Versiones para Flutter - fvm.


FVM - Flutter Version Manager

Para instalar FVM, puedes seguir la guía de inicio en el sitio de FVM. Yo seguiría la configuración independiente, como se recomienda en la guía. Voy a explicar cómo instalarlo en macOS, comienza instalando FVM con estos comandos:


brew tap leoafarias/fvm
brew install fvm

Se necesitan algunos pasos de configuración adicionales para comenzar a usar FVM en un proyecto. En primer lugar, añade la carpeta del SDK de Flutter que FVM usa para tu proyecto al .gitignore


FVM creará un enlace simbólico relativo en tu proyecto desde .fvm/flutter_sdk hasta la caché de la versión seleccionada. Añádelo a tu .gitignore

A continuación, tenemos que configurar nuestro IDE para usar la versión de Flutter seleccionada por FVM. Recomendaría el cambio automático de versión en lugar del manual para mantener las cosas simples. Para el cambio automático de versión basado en el proyecto, podemos establecer dart.flutterSdkPath.

A continuación, se muestran las configuraciones para VSCode para establecer la ruta del SDK de Flutter y eliminar la carpeta .fvm de la búsqueda de VSCode y del observador de archivos. (para Android Studio, consulta la guía de FVM):



{
  "dart.flutterSdkPath": ".fvm/flutter_sdk",
  // Remove .fvm files from search
  "search.exclude": {
    "**/.fvm": true
  },
  // Remove from file watching
  "files.watcherExclude": {
    "**/.fvm": true
  }
}

Como puedes ver, esto establece la ruta del SDK de Flutter a la versión de Flutter enlazada simbólicamente que tenemos en el proyecto, ubicada en .fvm/flutter_sdk.


Primero necesitamos instalar una versión de Flutter para obtener esta carpeta. Los siguientes comandos instalarán la versión estable actual de Flutter. Si estás haciendo esto para un proyecto, recomiendo usar una versión específica, es decir, 2.8.1, no "stable", ya que "stable" cambiará cada par de meses. Comandos para instalar y usar una versión de Flutter usando FVM:


# Show all available versions of Flutter
fvm releases

# Downloads and Installs the version specified, can use "stable" tag
fvm install 3.10.12

# Once in the project folder, sets the version of Flutter for the project
fvm use 3.10.12

Ahora tendremos la carpeta .fvm y la versión de Flutter establecida para este proyecto en 3.10.12.


Si fuera a crear otro proyecto, podría seguir los mismos comandos pero seleccionar una versión diferente de Flutter para ese proyecto. Esta configuración permite tener múltiples versiones de Flutter en una base por proyecto, ¡perfecto!


El desarrollador de FVM también ha añadido algunos comandos extra para adaptarse a otras necesidades que un desarrollador de Flutter podría tener. No entraré en detalles ya que no he necesitado usarlos, pero aquí tienes una lista de todos los comandos que FVM ofrece:



Available commands:
  config     Set configuration for FVM
  dart       Proxies Dart Commands
  doctor     Shows information about environment,
             and project configuration.
  flavor     Switches between different project flavors
  flutter    Proxies Flutter Commands
  global     Sets Flutter SDK Version as a global
  install    Installs Flutter SDK Version
  list       Lists installed Flutter SDK Versions
  releases   View all Flutter SDK releases available
             for install.
  remove     Removes Flutter SDK Version
  spawn      Spawns a command on a Flutter version
  use        Sets Flutter SDK Version
             you would like to use in a project

Ahora podrías estar pensando, esto es genial, ¡no necesito nada más! Si solo vas a desarrollar aplicaciones Flutter, podrías estar en lo correcto. Pero como desarrollador, sabes que las cosas cambian, y podría llegar un momento en el que necesites ejecutar Ruby o Node para un proyecto. Podrías descargar un gestor de versiones para cada una de esas herramientas y aprender a usarlos por separado, por ejemplo, aquí están los comandos que ofrece rbenv, un popular Gestor de Versiones de Ruby:



Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local
               application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific
               Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims
               (run this after installing executables)
   version     Show the current Ruby version
               and its origin
   versions    List installed Ruby versions
   which       Display the full path to an executable
   whence      List all Ruby versions that
               contain the given executable

Si apareciera otra herramienta que quisiéramos usar, podríamos instalar un Gestor de Versiones pero necesitaríamos aprender otro conjunto de comandos. Seguramente debe haber una manera de estandarizar todos estos Gestores de Versiones.



🌳 Trabajar con múltiples herramientas con múltiples versiones

Queremos un gestor de versiones estandarizado que pueda añadir fácilmente nuevas herramientas/lenguajes/frameworks para proteger nuestro entorno de desarrollo de cara al futuro. Afortunadamente, existe tal solución: ¡asdf-vm!


asdf-vm

Asdf es similar a los gestores de versiones de los que hemos hablado, pero con una gran diferencia. Puede gestionar múltiples versiones de tiempo de ejecución de herramientas en una base por proyecto. Asdf también utiliza shims para seleccionar la versión que estás utilizando. Los shims son ejecutables ligeros que pasan tu comando a asdf. Están al principio de tu PATH, por lo que la ejecución del comando los buscará primero al ejecutar un comando. Una vez que hayamos instalado Flutter a través de asdf, mostraré lo poderosos que pueden ser los shims.


Primero instalas asdf y luego instalas un plugin para la herramienta seleccionada. Por ejemplo, configuraré Flutter para mostrar las ventajas que asdf tiene sobre otras soluciones.


asdf es donde la verdadera magia ocurre ✨ asdf es donde la verdadera magia ocurre ✨


Asdf tiene una buena guía de configuración, y como antes; mostraré la configuración para macOS. Comienza instalando asdf con este comando:

brew install asdf

También instala jq ya que es necesario para el plugin de Flutter de asdf

brew install jq

Los siguientes pasos dependen del shell que uses. Yo uso Oh My Zsh, pero si usas bash u otro, puedes consultar los pasos en la guía oficial. Añade lo siguiente a tu archivo .zshrc.

El orden es importante:


# Add this near the top of the file
# This is to allow for auto-completion in the terminal
autoload -U +X bashcompinit && bashcompinit

# Add asdf to the plugin list for OhMyZsh
# I also had git here
plugins=(asdf)

# Then add this at the end of the file
unset ASDF_DIR
source $(brew --prefix asdf)/libexec/asdf.sh

Ahora que asdf está instalado, podemos añadir el plugin de Flutter. Este plugin incluye tanto Flutter como Dart. Hay plugins para la mayoría de las bibliotecas o frameworks, y si no los hay, puedes crear un plugin. Para Flutter, necesitamos ejecutar:

asdf plugin-add flutter

Y ahora necesitamos instalar una versión de Flutter con lo siguiente:

# List all versions of Flutter that you can install
asdf list all flutter

# Install a version of Flutter
# asdf doesn't have channels
# as this is a Flutter specific choice
# but you can add an optional channel
# to the end of the version like so
asdf install flutter 3.10.12-stable
asdf install flutter 3.10.12

# There is also a 'latest' keyword that
# will install the latest stable version
asdf install flutter latest

Con una versión de Flutter instalada, podemos instalar una versión específica para el proyecto y una versión global. Para la versión específica del proyecto, necesitamos cambiar al directorio del proyecto y ejecutar lo siguiente:

# to set this project to the latest stable
asdf local flutter latest

# Or setting a specific version
asdf local flutter 3.10.12-stable

Después de ejecutar este comando, asdf creará un archivo .tool-versions para rastrear la versión utilizada. Puedes usar este archivo para rastrear las versiones de múltiples herramientas. En nuestro ejemplo, contendrá una sola línea para Flutter:

flutter 3.10.12-stable

También podemos establecer la versión global de Flutter en el entorno de desarrollo usando este comando:

asdf global flutter 3.10.12-stable

Ahora viene la parte mágica, cuando ejecutes el comando flutter, tu máquina buscará en su PATH para encontrar el comando flutter. Primero, ejecutará el shim de asdf para flutter, que luego verifica si hay un archivo .tool-versions en el directorio actual. Si lo encuentra, utilizará la versión especificada en ese archivo. Si no, usará la especificada globalmente. Esta técnica es ideal ya que no necesitas hacer ninguna configuración en el IDE, ya que asdf usa el PATH de tu máquina para facilitar el cambio.


Así que cambiar tu directorio cambiará qué versión de Flutter estás ejecutando. ¡Muy poderoso!


Usar asdf es la evolución final. Esta configuración resuelve la mayoría de los casos que los desarrolladores encontrarán al usar o instalar diferentes versiones de herramientas. Asdf puede acomodar nuevas herramientas con su estructura de plugins mientras mantiene una estructura de comandos consistente.


El único avance que puedo ver que suceda es el cambio a Rust como frum por beneficios de rendimiento, pero incluso entonces es menor.


Si tienes un proyecto en mente y quieres desarrollaro utilizando Flutter, somos una empresa homologada de desarrollo Flutter en Barcelona.


Este artículo ha sido una traducción adaptada del artículo publicado por Iain Smith en su blog.


bottom of page