Cargando



Usando Cake en CoffeeScript

En este tutorial veremos la herramienta Cake incluida por defecto en CoffeeScript para la construcción de tareas automatizadas que nos ayudarán en el desarrollo de nuestros proyectos.


may 26 2015 03:29
Profesional
may 26 2015 09:57
CoffeeScript es un lenguaje que nos permite escribir mejor código JavaScript, esto unificándolo y enmarcándolo bajo una misma estructura, donde estaremos seguros que el código JavaScript creado mediante CoffeeScript por otro desarrollador será idéntico al de nosotros.

Pero esto no es todo lo que ofrece CoffeeScript, adicionalmente el mismo posee una herramienta llamada Cake, similar a Grunt que nos permite definir tareas simples para ayudarnos con nuestros proyectos, ya que es posible que necesitemos una tarea para ejecutar pruebas o simplemente una para hacer build de nuestros archivos y todo esto lo podemos hacer con Cake a través de un archivo llamado Cakefile.

Requisitos
Para completar este tutorial debemos tener una instalación funcional de CoffeeScript, además necesitamos permisos para escribir archivos y ejecutar CoffeeScript en el equipo donde estemos haciendo el tutorial. Necesitamos un editor de textos como Sublime Text para poder escribir el código de nuestros ejemplos y nunca está de más darle un vistazo a los tutoriales pasados del lenguaje.

Cake y Cakefile


Antes de empezar es importante mencionar que no necesitamos instalar Cake, al momento de nuestra instalación inicial de CoffeeScript la herramienta se instala por igual, así que no necesitamos realizar nada adicional para empezar a trabajar con la misma.

Sabiendo esto ya podemos empezar a trabajar con Cake, pero debemos entender que todas las tareas que creemos deben estar situadas en un archivo llamado Cakefile, el cual debe poseer exactamente el mismo nombre ya que cakefile será un archivo totalmente distinto y el compilador no lo reconocerá.

Este archivo debe estar en la raíz de nuestro proyecto y es de suma importancia que el contenido del mismo sea meramente código CoffeeScript. Ya habiendo aclarado esto, veamos cómo crear nuestra primera tarea con Cake.

Tareas con Cake


Vamos a crear una carpeta llamada cakefile_ejemplo y allí vamos a crear un archivo llamado Cakefile.coffee y contendrá el siguiente contenido:
task "saludo", "Vamos a saludar a la gran comunidad de Solvetic", ->
console.log "Hola, Mundo!"
Antes de explicar nuestro código vamos a compilarlo y ver el contenido generado en JavaScript, esto no es necesario ya que nunca estaremos viendo este código, pero en esta ocasión no nos vendría mal para entender de mejor manera que está haciendo CoffeeScript, veamos la salida:


Ya que estamos en contexto podemos explicar nuestro código, primero definimos la tarea con la función task que se añade automáticamente a cada archivo Cakefile. El primer argumento de la función es el nombre de la tarea, en este caso es saludo y lo utilizaremos en la consola de comandos para ejecutar la tarea, el segundo argumento puede ser opcional y es una descripción de la tarea que aparecerá en el listado de nuestras tareas disponibles. El último argumento que enviamos en la función task es otra función que será ejecutada por la tarea y es donde la mayoría de nuestra lógica será depositada.

El ejemplo anterior fue solo para comprobar que hacía el compilador, pero nuestro archivo Cakefile no debe poseer ninguna extensión. Podemos adicionalmente ver que tareas tenemos disponibles con el comando cake en la consola de comandos, veamos como luce:

usando-cake-coffeescript-2.jpg


Como vemos podemos ver el nombre de nuestra tarea así como la descripción. Ahora para ejecutar una tarea en particular usamos el comando cake seguido del nombre de la tarea, para finalizar veamos la salida por la consola:

usando-cake-coffeescript-3.jpg


Usando opciones


Ya sabemos cómo crear una tarea y ejecutarla, pero, ¿Qué pasa si deseamos pasarle algunos argumentos a la misma? Por ejemplo, ¿Qué pasa si queremos que nuestro saludo sea totalmente personalizado de acuerdo a un valor que enviemos? Esto es bastante sencillo de hacer, veamos.

Lo primero que debemos hacer en nuestra tarea es definir la opción, esto lo hacemos con la función option disponible Cake. Esta función toma tres argumentos, el primero es la forma abreviada de la opción, el segundo es la forma larga y el último es una descripción de que hace la opción, algo importante si estamos desarrollando en equipo y queremos documentar nuestras tareas. Vamos entonces a realizar las modificaciones sobre nuestra tarea para definir la opción:
option '-n', '--nombre [NOMBRE]', 'nombre para saludar'
task "saludo", "Decimos hola a alguien", (options)->
			    message = "Hola, "
			    if options.nombre?
							   message += options.nombre
			    else
							   message += "Mundo"
			    console.log message
Como vemos antes de la definición de task tenemos nuestra función option, seguido de la forma corta que sería –n, luego tenemos la forma larga que sería –nombre especificando que esperará un valor y por último la descripción. Vamos a ejecutar el comando cake y veamos la salida en nuestra consola:

usando-cake-coffeescript-4.jpg


Como vemos tenemos el nombre de nuestra tarea, la descripción y debajo de la misma tenemos las opciones disponibles para la misma, la opción corta y la larga al igual que la descripción. Vamos a ejecutar nuestra tarea con la opción corta y veamos la salida por la consola:

usando-cake-coffeescript-5.jpg


Para ejecutar una tarea con opciones es importante que primero especifiquemos los argumentos y luego el nombre de la tarea ya que si no nos toparemos con un error no dice mucho de lo que pueda estar pasando con nuestro archivo Cakefile, veamos entonces cómo es la ejecución utilizando la segunda opción:

usando-cake-coffeescript-6.jpg


Aquí pasando algo peculiar y es que antes de ejecutar la tarea utilizamos la opción con un solo guion, dándonos un error y es lo correcto ya que en nuestra tarea hemos definido la opción como ---nombre en vez de –nombre, demostrando así la eficacia de CoffeeScript para el funcionamiento de las tareas.

Adicionalmente podemos definir si una opción es requerida y esto lo hacemos en la definición de la tarea verificando si existe el valor y sino lanzamos un error, veamos como luce este código:
option '-n', '--nombre [NOMBRE]', 'nombre que quieres saludar'
task "saludo", "Verificar que exista la opcion", (options)->
			    throw new Error("[NOMBRE] es un valor requerido") unless options.nombre?
			    console.log "Hola, #{options.nombre}"
Vamos entonces a ejecutar nuestra tarea pero esta vez pasando por alto la opción como argumento y veamos la respuesta de la consola:

usando-cake-coffeescript-7.jpg


Como vemos el error que incluimos en el archivo fue mostrado pudiendo así validar que las opciones para nuestras tareas sean pasadas como argumentos cuando sean necesarias.

Invocando otras tareas


Ya habiendo visto como crear nuestras tareas y definir opciones para las mismas es importante ver cómo podemos ejecutar tareas que se encuentran dentro otras. Por ejemplo podemos tener dos tareas en común en un proyecto donde una de las tareas se encargue de limpiar los directorios que hemos construido para el proyecto y la otra se encargue de realizar la compilación y la construcción, veamos como lucen estas dos tareas que acabamos de describir:
task "limpiar", "Esta tarea realiza la limpieza de los directorios", ->
			    console.log "limpiando los dir..."

task "construir", "Construye y compila los archivos para el proyecto", ->
			    console.log "construyendo..."
Vamos a ejecutar el comando cake y veamos la respuesta por la consola:

usando-cake-coffeescript-8.jpg


Adicionalmente para correr ambas tareas juntas podemos usar el comando cake seguido de ambos nombres de nuestras tareas:

usando-cake-coffeescript-9.jpg


Como vemos no hay nada extraño en nuestras tareas, pero si somos observadores nos damos cuenta que primero tenemos que ejecutar la tarea de limpieza siempre antes de nuestra tarea de construcción, pero ¿Qué pasa si queremos una tercera tarea llamada empaquetar, la cual luego empaquetará el proyecto por nosotros? Entonces debemos primero construir el mismo, asegurarnos que los directorios estén limpios y por último construir.

El problema es que esta solución no es óptima, si por alguna razón se nos olvida llamar a la tarea limpiar o peor aún, a nuestra tarea construir tendremos problemas con nuestra tercera tarea, afortunadamente Cake nos permite llamar una tarea dentro de otra con la función invoke, veamos entonces como queda nuestro archivo Cakefile con la nueva tarea y las modificaciones:
task "limpiar", "Esta tarea realiza la limpieza de los directorios", ->
			    console.log "limpiando los dir..."

task "construir", "Construye y compila los archivos para el proyecto", ->
			    console.log "construyendo..."

task "empaquetar", "limpia, construye y empaqueta nuestro proyecto", ->
			    invoke "limpiar"			  
			    invoke "construir"
			    console.log "empaquetando..."
Ahora solo debemos llamar a nuestra empaquetar y de esa forma nos aseguramos que las otras dos tareas requeridas sean llamadas sin problemas, veamos la salida en la consola de comandos:

usando-cake-coffeescript-10.jpg


Es importante mencionar que las tareas que usan la función invoke son ejecutadas de manera asincrónica, por lo que no tenemos garantía de que la tarea limpiar se ejecutará antes de construir y empaquetar, así que debemos tener cuidado en su uso.

Con esto damos por finalizado este tutorial, donde aprendimos a crear nuestras tareas, ejecutarlas, darle opciones e incluso como invocar a otras tareas dentro de otras, así expandiendo nuestros conocimientos en este eficaz lenguaje que contribuye a las mejores prácticas de cualquier desarrollo.

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X