Uso de Taskfile para Automatización de Tareas
Llevas semanas con el mismo ./scripts/build.sh, el mismo go test ./... escrito a mano, el mismo ciclo de limpiar y compilar antes de cada commit. Taskfile resuelve exactamente eso: un archivo YAML en la raíz del proyecto que centraliza los comandos que repites a diario. No es magia. Es simplemente tener las cosas en un solo lugar.
¿Qué es Taskfile?
Taskfile define un conjunto de tareas y cómo ejecutarlas. La comparación con Makefile es inevitable, pero Taskfile usa YAML en lugar de una sintaxis propia con reglas de indentación que nadie recuerda. Eso solo ya lo hace más accesible para equipos que no vienen del mundo C.
Ejemplo de Taskfile básico
version: '3'
tasks:
build:
desc: "Construir el proyecto"
cmds:
- echo "Construyendo el proyecto..."
- go build -o bin/app
test:
desc: "Ejecutar pruebas"
cmds:
- echo "Ejecutando pruebas..."
- go test ./...
clean:
desc: "Limpiar archivos generados"
cmds:
- echo "Limpiando..."
- rm -rf bin
Tres tareas: build, test y clean. Cada una tiene una descripción (desc) y una lista de comandos (cmds). Mantener la descripción actualizada no es opcional si quieres que task --list sirva de algo cuando alguien nuevo entra al proyecto y no sabe por dónde empezar.
Instalación de Task
Task está disponible en los gestores de paquetes habituales. En macOS lo instalo con Homebrew; en servidores Debian/Ubuntu uso el paquete del sistema. La documentación oficial también ofrece un script de instalación si prefieres no depender del gestor.
# Instalar Task en sistemas basados en Debian/Ubuntu
sudo apt install task
# Instalar Task en macOS
brew install go-task/tap/go-task
Uso de Task
Con Task instalado, la interfaz es directa: task seguido del nombre de la tarea.
# Ejecutar la tarea de construcción
task build
# Ejecutar todas las tareas
task
Sin argumentos, Task busca una tarea llamada default y la corre. Si no existe, ejecuta todas las tareas del archivo en orden. Ese comportamiento no está donde uno espera encontrarlo en la documentación, y me costó un rato pillarlo la primera vez.
Personalización y Buenas Prácticas
Variables de Entorno
Las variables de entorno se declaran al nivel del archivo y quedan disponibles en todas las tareas. Útil cuando cross-compilas para múltiples plataformas o necesitas separar configuración de código.
env:
GOOS: linux
GOARCH: amd64
tasks:
build:
cmds:
- echo "Construyendo para $GOOS/$GOARCH..."
- GOOS=$GOOS GOARCH=$GOARCH go build -o bin/app
Dependencias entre Tareas
Task permite encadenar tareas mediante deps. La clave deps lista las tareas que deben completarse antes de que la tarea actual arranque. Sin eso, terminas escribiendo lógica de orquestación dentro de los propios comandos, que es exactamente lo que Taskfile debería evitar.
tasks:
build:
deps: [clean]
cmds:
- echo "Construyendo el proyecto..."
clean:
cmds:
- echo "Limpiando..."
- rm -rf bin
El orden importa. Si clean falla, build no arranca. Eso es lo correcto.
Taskfile no reemplaza un sistema de CI/CD ni pretende hacerlo. Lo que sí hace bien es eliminar la fricción del día a día: ese momento en que alguien del equipo pregunta “¿cómo se construye esto?” y la respuesta es task build, sin buscar el README, sin revisar scripts dispersos por el repo. Lo tengo en todos mis proyectos activos. Vale la pena el cuarto de hora que toma configurarlo.