¿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:
🌱 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.
Comments