Deno + Tasks = Productividad: todo lo que debes saber

A medida que nuestra aplicación crece en complejidad, encontraremos más comandos para memorizar: iniciar servidores de desarrollo, crear versiones de producción y ejecutar pruebas, entre otros. Para evitar ejecutar todos estos comandos constantemente en la terminal con deno, podemos utilizar "tareas" (tasks) - comandos definidos en el archivo deno.json.

Por ejemplo, podemos definir un comando que ejecute nuestro main.ts con los permisos necesarios, incluyendo la opción --watch para actualizaciones automáticas del código.

deno.json
{
"tasks": {
"dev": "deno run --allow-read --watch main.ts"
},
"imports": {
"@std/assert": "jsr:@std/assert@1",
"@std/text": "jsr:@std/text@^1.0.8"
}
}

Con esta configuración, simplemente ejecutamos deno task dev en la terminal, haciendo el proceso más eficiente.

#Opciones para ejecutar tareas

Consideremos un archivo main.ts que utiliza setInterval:

main.ts
let i = 0;
 
setInterval(() => {
console.log(i);
i++;
}, 1 * 1000);

La opción --watch reiniciará automáticamente la tarea cuando modifiquemos el código, ahorrando tiempo y esfuerzo.

Una ventaja clave de Deno es su compatibilidad con scripts de NPM existentes. Si nuestro proyecto tiene un archivo package.json, podemos ejecutar scripts de NPM prefijándolos con npm en la tarea de Deno.

deno.json
{
"tasks": {
"dev": "deno run --allow-read --watch main.ts",
+ "build": "deno run npm:build"
},
"imports": {
"@std/assert": "jsr:@std/assert@1",
"@std/text": "jsr:@std/text@^1.0.8"
}
}

El sistema de tareas de Deno ofrece varias opciones para ejecutar múltiples comandos:

  • Ejecución Secuencial (;): Ejecuta comandos en secuencia, independientemente del resultado

    deno.json
    {
    "tasks": {
    "dev": "deno run --allow-read --watch main.ts",
    "build": "deno run npm:build",
    + "test": "deno test",
    + "prod": "deno task test ; deno task build"
    },
    "imports": {
    "@std/assert": "jsr:@std/assert@1",
    "@std/text": "jsr:@std/text@^1.0.8"
    }
    }
  • Ejecución Condicional (&&): Ejecuta el siguiente comando solo si el anterior tiene éxito

    deno.json
    {
    "tasks": {
    "dev": "deno run --allow-read --watch main.ts",
    "build": "deno run npm:build",
    "test": "deno test",
    - "prod": "deno task test ; deno task build"
    + "prod": "deno task test && deno task build"
    },
    "imports": {
    "@std/assert": "jsr:@std/assert@1",
    "@std/text": "jsr:@std/text@^1.0.8"
    }
    }
  • Ejecución Alternativa (||): Ejecuta el segundo comando solo si el primero falla

    deno.json
    {
    "tasks": {
    "dev": "deno run --allow-read --watch main.ts",
    "build": "deno run npm:build",
    "test": "deno test",
    - "prod": "deno task test && deno task build"
    + "prod": "deno task test || deno task build"
    },
    "imports": {
    "@std/assert": "jsr:@std/assert@1",
    "@std/text": "jsr:@std/text@^1.0.8"
    }
    }
  • Ejecución Asíncrona (&): Ejecuta comandos simultáneamente

    deno.json
    {
    "tasks": {
    "dev": "deno run --allow-read --watch main.ts",
    "build": "deno run npm:build",
    "test": "deno test",
    - "prod": "deno task test || deno task build"
    + "prod": "deno task test & deno task build"
    },
    "imports": {
    "@std/assert": "jsr:@std/assert@1",
    "@std/text": "jsr:@std/text@^1.0.8"
    }
    }

Además, podemos redirigir el output de nuestros scripts a un archivo usando > o utilizar comandos Unix directamente en las tareas, funcionando perfectamente en Windows, macOS y Linux.

deno.json
{
"tasks": {
"dev": "deno run --allow-read --watch main.ts > log.txt"
},
"imports": {
"@std/assert": "jsr:@std/assert@1",
"@std/text": "jsr:@std/text@^1.0.8"
}
}

El sistema de tareas de Deno es una solución completa para mantener nuestros comandos organizados y optimizar nuestro flujo de trabajo de desarrollo.