El CLI de Dart: Tu centro de mando para el desarrollo
El comando dart es la interfaz de línea de comandos (CLI) que actúa como el centro de mando de todo tu ecosistema. No es solo un ejecutor de archivos, es una herramienta integral que gestiona el ciclo de vida completo de una aplicación: desde la creación del proyecto con dart create hasta la compilación para producción. Esta arquitectura centralizada existe para que todas las herramientas (el linter, el formateador, el compilador y el gestor de dependencias) compartan el mismo entorno y respeten la configuración de tu proyecto definida en el archivo pubspec.yaml.
Usarás el CLI constantemente: para ejecutar código con dart run, para asegurar la calidad con dart analyze o dart test, y para transformar tu código en algo distribuible mediante dart compile. Si intentas ejecutar un archivo que depende de paquetes externos usando simplemente dart archivo.dart en lugar de dart run, el runtime no encontrará las dependencias y el programa fallará. Asimismo, ignorar las alertas de dart analyze o no estandarizar el estilo con dart format solo te traerá problemas de mantenibilidad y errores de tipos que el compilador detectará tarde en el proceso.
// Este archivo sería bin/calculadora.dart en un proyecto real.
// Para ejecutarlo: `dart run bin/calculadora.dart --sumar 5 10`
void main(List<String> arguments) {
if (arguments.isEmpty) {
print('Uso: dart run bin/calculadora.dart <operacion> <n1> <n2>');
return;
}
final operacion = arguments[0].toLowerCase();
// Validamos que existan al menos dos números
if (arguments.length < 3) {
print('Error: Se requieren dos números.');
return;
}
final n1 = double.tryParse(arguments[1]);
final n2 = double.tryParse(arguments[2]);
if (n1 == null || n2 == null) {
print('Error: Los argumentos deben ser números válidos.');
return;
}
// Ejecución de la lógica
switch (operacion) {
case '--sumar':
print('Resultado: ${n1 + n2}');
break;
case '--restar':
print('Resultado: ${n1 - n2}');
break;
default:
print('Operación no reconocida.');
}
}
Cuando ejecutas este script, hay varios comandos del CLI que interactúan con él de formas distintas. Si usas dart run bin/calculadora.dart --sumar 5 10, el comando dart run no solo ejecuta el archivo, sino que le dice al runtime que debe cargar todas las librerías declaradas en tu pubspec.yaml antes de empezar. Si lanzaras simplemente dart bin/calculadora.dart, el programa fallaría si añadiéramos una dependencia externa como package:args.
Para preparar este código para producción, no usaríamos el modo de desarrollo. En su lugar, utilizaríamos dart compile exe bin/calculadora.dart -o calculadora. Esto activa la compilación AOT (Ahead-of-Time), generando un archivo binario nativo independiente que no requiere que el usuario tenga instalado el SDK de Dart. Si estuviéramos trabajando en un proyecto web, usaríamos dart compile js para transformar este código a JavaScript.
Antes de enviar este código a un repositorio, deberías ejecutar dart format . para que el linter ajuste automáticamente la indentación y los espacios según el estándar de Dart, y luego dart analyze para verificar que no haya errores de tipos o posibles valores null que rompan la ejecución.
El error frecuente
Un error muy común cuando se empieza es intentar ejecutar un archivo que importa paquetes de terceros usando el comando dart directo, por ejemplo: dart bin/main.dart.
// bin/main.dart
import 'package:intl/intl.dart'; // Este paquete está en pubspec.yaml
void main() {
print(DateFormat('yyyy-MM-dd').format(DateTime.now()));
}
Si ejecutas dart bin/main.dart, obtendrás un error de “package not found” porque el comando dart a secas no busca en la carpeta de paquetes de tu proyecto (.dart_tool). Para que el runtime reconozca el ecosistema de tu proyecto, siempre debes usar dart run bin/main.dart.
N° 5