pub es el gestor de paquetes de Dart, la herramienta encargada de organizar, descargar y gestionar todas las librerías externas que tu proyecto necesita para funcionar. Piensa en él como el director de orquesta: tú le dices qué instrumentos (librerías) quieres en tu función a través de un archivo llamado pubspec.yaml, y él se encarga de buscar las partituras correctas en pub.dev (el repositorio oficial de paquetes de Dart), asegurarse de que todos los músicos toquen en la misma tonalidad y evitar que dos músicos intenten tocar una versión distinta de la misma partitura al mismo tiempo.
Para que este sistema funcione, Dart utiliza un SAT solver (un motor de resolución lógica). Cuando añades una librería, no solo descargas un archivo; el motor analiza un árbol complejo de dependencias para encontrar una combinación de versiones que sea matemáticamente compatible para todos los paquetes involucrados. Si intentas añadir una librería que requiere una versión de http incompatible con otra que ya tienes, el motor fallará antes de romper tu código, avisándote del conflicto de versiones.
Debes usar pub desde el primer segundo en que creas un proyecto. Se usa para añadir herramientas de desarrollo, librerías de red, utilidades de fechas o cualquier código que no quieras escribir desde cero. Si gestionas mal las dependencias o intentas forzar versiones mediante dependency_overrides (una herramienta de “fuerza bruta” para obligar a Dart a usar una versión específica cuando hay un conflicto) de forma incorrecta, lo que realmente rompes es la seguridad del tipado o la estabilidad de tu aplicación, provocando errores en tiempo de ejecución que el compilador no pudo detectar.
// Para que este código funcione, necesitas un archivo 'pubspec.yaml'
// en la misma carpeta con el contenido que verás en el comentario inferior.
/*
// ---------------------------------------------------------
// CONTENIDO DEL ARCHIVO: pubspec.yaml
// ---------------------------------------------------------
name: ejemplo_gestion_pub
description: Un ejemplo práctico para entender cómo funciona pub.
version: 1.0.0
environment:
sdk: '>=3.4.0 <4.0.0'
dependencies:
# Se descarga desde pub.dev
http: ^1.2.0
# Ejemplo de dependencia de Git (no está en pub.dev)
# package_git:
# git:
# url: https://github.com/dart-lang/example.git
# ref: main
# Ejemplo de dependencia local (una carpeta en tu disco)
# mi_libreria_local:
# path: ../libreria_personalizada
dependency_overrides:
# Se usa solo en emergencias para forzar una versión
# si dos paquetes entran en conflicto.
http: 1.1.0
*/
import 'package:http/http.dart' as http;
import 'dart:convert';
// Al ejecutar 'dart pub get', Dart descarga el paquete 'http'
// y lo registra en tu sistema para que este import funcione.
void main() async {
final url = Uri.parse('https://jsonplaceholder.typicode.com/todos/1');
print('Iniciando petición HTTP...');
try {
// Usamos la librería externa gestionada por pub
final response = await http.get(url);
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
print('Datos recibidos con éxito: $data');
} else {
print('Error en el servidor: ${response.statusCode}');
}
} catch (e) {
print('Error de conexión: $e');
}
}
Desglose del ejemplo
En el bloque de código anterior, el archivo pubspec.yaml actúa como la fuente de verdad. Cuando ejecutas dart pub get, el SDK de Dart lee ese archivo, se conecta a pub.dev y resuelve el árbol de dependencias.
Si te fijas en la sección dependencies, hemos declarado http: ^1.2.0. El símbolo ^ es un constraint (restricción) que le dice al SAT solver: “puedes usar cualquier versión que sea compatible con la 1.2.0, pero no pases de la 2.0.0”. Esto es vital para la estabilidad.
Si el proyecto se vuelve complejo y tienes un conflicto donde un paquete pide http v1.2.0 y otro pide http v1.1.0, podrías sentir la tentación de usar dependency_overrides. En el ejemplo, hemos forzado http: 1.1.0. Esto le dice al compilador: “Ignora todas las demás peticiones y usa esta versión exacta”. Es una herramienta de rescate, no una práctica habitual.
Cuando ejecutas dart pub add http en tu terminal, el comando no solo añade la línea al pubspec.yaml, sino que también ejecuta el proceso de resolución automáticamente. Si quieres ver qué librerías ha descargado tu proyecto y por qué (el árbol completo), el comando dart pub deps te mostrará la jerarquía exacta de dependencias, permitiéndote rastrear de dónde viene cada paquete.
Para mantener tu proyecto sano, usa dart pub upgrade periódicamente; esto intentará subir las versiones de tus librerías siempre que respeten los límites que definiste en el archivo.
El error frecuente
Un error clásico ocurre cuando intentas usar una dependencia local o de Git de forma incorrecta en el pubspec.yaml. Por ejemplo, si usas path: ./mi_libreria pero la carpeta no existe o no es un paquete de Dart válido (no tiene su propio pubspec.yaml), dart pub get fallará con un error de resolución.
Otro error crítico es el uso descuidado de dependency_overrides. Si fuerzas una versión de una librería que ha cambiado su API (por ejemplo, forzar una v1.0.0 cuando el resto del código espera la v2.0.0), el programa compilará pero fallará estrepitosamente con errores de “method not found” o tipos incompatibles en tiempo de ejecución, porque has engañado al sistema de tipos de Dart.
N° 7