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.
{
"tasks": {
"dev": "deno run --allow-read --watch main.ts"// [tl! highlight]
},
"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
:
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.
{
"tasks": {
"dev": "deno run --allow-read --watch main.ts",
"build": "deno run npm:build"// [tl! add]
},
"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{ "tasks": { "dev": "deno run --allow-read --watch main.ts", "build": "deno run npm:build", "test": "deno test",// [tl! add] "prod": "deno task test ; deno task build"// [tl! add] }, "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{ "tasks": { "dev": "deno run --allow-read --watch main.ts", "build": "deno run npm:build", "test": "deno test", "prod": "deno task test ; deno task build"// [tl! remove] "prod": "deno task test && deno task build"// [tl! add] }, "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{ "tasks": { "dev": "deno run --allow-read --watch main.ts", "build": "deno run npm:build", "test": "deno test", "prod": "deno task test && deno task build"// [tl! remove] "prod": "deno task test || deno task build"// [tl! add] }, "imports": { "@std/assert": "jsr:@std/assert@1", "@std/text": "jsr:@std/text@^1.0.8" } }
-
Ejecución Asíncrona (
&
): Ejecuta comandos simultáneamente{ "tasks": { "dev": "deno run --allow-read --watch main.ts", "build": "deno run npm:build", "test": "deno test", "prod": "deno task test || deno task build"// [tl! remove] "prod": "deno task test & deno task build"// [tl! add] }, "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.
{
"tasks": {
"dev": "deno run --allow-read --watch main.ts > log.txt"// [tl! highlight]
},
"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.