Anunciando Dart 2.8
Herramientas de paquetes más rápidas, nueva herramienta para asegurar que las dependencias nunca queden obsoletas
Hoy anunciamos un nuevo lanzamiento del SDK de Dart, versión 2.8. Continuamos viendo un crecimiento asombroso en la comunidad de Dart; ahora tenemos millones de desarrolladores de Flutter usando Dart como su lenguaje optimizado para cliente para construir apps rápidas en cualquier plataforma. Mientras seguimos trabajando duro en completar nuestra característica de próxima null safety para hacer de Dart un lenguaje aún más optimizado para construir interfaces de usuario rápidas y estables, tenemos algunas nuevas características emocionantes enfocadas en hacer a los desarrolladores aún más productivos al gestionar dependencias.
La plataforma Dart viene con soporte integrado para gestión de paquetes vía la herramienta cliente pub
y el repositorio de paquetes pub.dev, que ha crecido un 200% en el último año y ahora alberga casi 10.000 paquetes. Como parte de nuestro trabajo continuo para mejorar el ecosistema de Dart, el SDK de Dart 2.8 trae dos mejoras a la herramienta cliente pub: mucho mejor rendimiento en
pub get, y una nueva herramienta para asegurar que las dependencias de tus paquetes se mantengan actualizadas.
Dart 2.8 también trae un conjunto de pequeños cambios disruptivos en el lenguaje y librerías de Dart. Estos cambios sientan las bases para nuestra primera versión de la característica de null safety.
Cambios disruptivos que allanan el camino para null safety
#Una fuente común de crasheos de apps es código que intenta usar una variable que resulta ser null. Sir Tony Hoare, quien introdujo las referencias nulas en el lenguaje de programación ALGOL en 1965, las llamó famosamente su
“error de mil millones de dólares” en una charla en QCon en 2009. En algunos casos los valores null son útiles; el desafío es separar esos de los casos donde no lo son. Durante el último año hemos estado ocupados construyendo soporte para
sound null safety en Dart. Este soporte extenderá el sistema de tipos para expresar variables que son siempre non-nullable, pero además el sistema de tipos será totalmente sound: los compiladores y runtimes de Dart podrán confiar en esos tipos, y podrán producir código optimizado cuando el sistema de tipos garantice que una variable no es null.
Como puedes imaginar, esto es una empresa grande con muchas partes en movimiento. Para asegurar que podamos construir null safety con semántica limpia, hemos decidido hacer algunos pequeños cambios disruptivos en el lenguaje y librerías de Dart. Estos cambios disruptivos hacen ajustes menores a casos límite del sistema de tipos de Dart y a algunas librerías core de Dart para asegurar excelente usabilidad y rendimiento relacionados con la nulabilidad. Esperamos que el impacto real de estos cambios disruptivos — que fueron anunciados previamente en la lista de anuncios de Dart — sea mínimo para el código regular de apps. Si experimentas algún problema con Dart 2.8, te animamos a revisar los cambios disruptivos y sus descripciones y pasos de mitigación. Si eso no resuelve el problema, por favor crea un issue en nuestro tracker de issues. Para una vista previa de la experiencia de null safety, prueba el playground de null safety.
Un ecosistema de paquetes de mayor calidad
#El gestor de paquetes pub y el sitio pub.dev impulsan un ecosistema en constante crecimiento para Dart y Flutter. Casi 10.000 paquetes están disponibles en pub.dev, y continuamente nos sorprende la cantidad de paquetes interesantes que se comparten. Ha sido nuestra misión principal ayudar a los autores de paquetes a crear paquetes de alta calidad y ayudar a los desarrolladores de apps a encontrar esos paquetes — por ejemplo, hemos añadido descubrimiento mejorado en pub.dev, publicadores verificados y Flutter Favorites.
Hoy anunciamos un rendimiento mucho más rápido al recuperar paquetes del repositorio
pub.dev, y una nueva herramienta para ayudarte a mantener todas tus dependencias de paquetes actualizadas. Con la complejidad de las apps modernas, tu app probablemente depende de docenas de paquetes. Pero ¿cómo mantienes todos actualizados a la última versión, para asegurar que estás obteniendo las dependencias más recientes con todas las correcciones de bugs y mejoras de rendimiento disponibles? A partir de Dart 2.8, puedes usar
pub outdated, una nueva herramienta para determinar automáticamente cuáles de tus dependencias necesitan ser actualizadas a las últimas versiones.
Mejoras de rendimiento de la herramienta pub en Dart 2.8
#Optimizamos el rendimiento de la herramienta pub añadiendo soporte para la obtención paralela de paquetes al ejecutar
pub get, y aplazando la precompilación de pub run.
En un benchmark informal de ejecutar flutter pub get en un nuevo proyecto creado con flutter create, el tiempo total de ejecución disminuyó de aproximadamente 6,5 segundos en Flutter 1.12 (que usa Dart 2.7) a solo 2,5 segundos con Flutter 1.17 (Dart 2.8). En una app más grande como la
galería de Flutter, ¡el tiempo baja de aproximadamente 15 segundos a aproximadamente 3 segundos!
Gestionando dependencias con pub outdated
#
Las dependencias en código Dart se capturan en el archivo pubspec. Cuando recuperas paquetes de pub.dev ejecutando el comando
pub get, el resolvedor de versiones de pub (que usa el algoritmo
PubGrub) ejecuta un proceso para determinar el último conjunto posible de versiones de todas tus dependencias que satisface las restricciones listadas en tu pubspec. Ten en cuenta que pub usa un esquema de versión única donde cada paquete se incluye en una sola versión en tu app; esta es una optimización importante para asegurar que el tamaño de tu app sea lo más pequeño posible.
Es una buena práctica usar siempre las últimas versiones estables de paquetes, pero hacerlo puede ser laborioso. Dart tiene soporte para actualizar a las últimas versiones que son
semánticamente compatibles usando
pub upgrade, pero no puedes incluir nuevas versiones mayores de paquetes sin actualizar el pubspec. El comando
pub outdated te ayuda a entender cuándo están disponibles tanto versiones menores como mayores comparando las versiones usadas actualmente con las últimas versiones disponibles en pub.dev.
Consideremos un ejemplo concreto. Imagina que estás construyendo una app, y su pubspec.yaml contiene lo siguiente:
dependencies:
foo: ^1.3.0
bar: ^2.0.0
Ejecutas pub get, y la herramienta crea un archivo pubspec.lock con las siguientes versiones:
packages:
foo:
version: "1.3.0"
bar:
version: "2.0.1"
Pasan unos meses, y pub.dev ahora tiene nuevas versiones de foo (1.3.1) y bar (2.1.0 y 3.0.3). ¿Cómo descubres que estas nuevas versiones están disponibles? Para las actualizaciones de versión menor (foo
1.4.0 y bar 2.1.0) podrías ejecutar pub upgrade, pero eso no te daría bar
3.0.0. Para descubrir esa nueva versión tendrías que visitar cada paquete en pub.dev y mirar su última versión. Alternativamente, podrías usar una solución de la comunidad como el
version checker de Paulina Szklarska o el
pubspec assist de Jeroen Meijer.
Con pub outdated, el SDK de Dart ahora soporta el descubrimiento de versiones. Si estás usando un IDE con soporte para Dart o Flutter, usa la acción
Pub outdated que se muestra cuando el archivo pubspec.yaml está abierto. O puedes ejecutar
pub outdated (o flutter pub outdated) desde la terminal:
**$** pub outdated
Dependencies Current Upgradable Resolvable Latest
foo 1.3.0 1.3.1 1.3.1 1.3.1
bar 2.0.1 2.1.0 3.0.3 3.0.3
1 upgradable dependency is locked (in pubspec.lock) to an older version.
To update it, use `pub upgrade`.
1 dependency is constrained to a version that is older than a resolvable version.
Esta salida nos dice que podemos actualizar automáticamente a foo 1.3.1 con pub upgrade, lo que nos pondrá en la última versión disponible de
foo. Pero también nos dice que mientras podríamos actualizar automáticamente a bar 2.1.0, una versión 3.0.3 está disponible. Como la actualización a
bar 3.0.3 es una actualización de versión mayor, necesitamos optar por esa actualización editando nuestro archivo pubspec.yaml:
dependencies:
foo: ^1.3.0
bar: ^3.0.3
Después de hacer esa edición y ejecutar pub upgrade, pub outdated ahora reporta que todas las dependencias están actualizadas:
**$** pub outdated
Dependencies Current Upgradable Resolvable Latest
all up-to-date
¡Éxito, estamos actualizados! Como acabamos de tomar nuevas versiones, incluyendo una nueva versión mayor, deberíamos revisar cualquier posible cambio disruptivo en esas versiones, y ejecutar todas las pruebas para asegurar que nuestra app sigue funcionando como se espera.
Próximos pasos
#Las mejoras de rendimiento, los cambios disruptivos y el nuevo comando
pub outdated están disponibles hoy en el SDK de Dart 2.8 estable
y en el SDK de Flutter 1.17 estable. Recomendamos que
ejecutes pub outdated hoy para ver el estado de tus dependencias!
Si encuentras algún problema, por favor repórtalo en el tracker de issues de pub, o en el
tracker de issues del SDK para problemas generales. Nos encantaría escuchar sobre tu experiencia con
pub outdated. Deja un comentario abajo o envía un tweet a @dart_lang.