Una de los principales features que nos ofrece Ruby on Rails junto con Rake es la posibilidad de crear, programar y ejecutar tareas. Las tareas pueden ser procesos sencillos como lo es el envío de correos electronicos, respaldo de información, actualización de registros, hasta cosas un poco más complejas, por ejemplo, realizar reportes. 😓
Si has utilizado Ruby on Rails con anterioridad, muy probablemente, te resulte familiar el siguiente comando.
rake db:migrate
Bien, pues dejame decirte que con esa sentencia estamos ejecutando una tarea de Rails. 😎
Rails por default ya nos provee de una gran cantidad de tareas.
Crear y ejecutar tareas
Crear una tarea es sumamente sencillo, basta con ejecutar el siguiente comando.
rails generate task namespace nombre_de_la_tarea
En mi caso generó una tarea llamada say_hello dentro dentro del namespace codigofacilito.
rails generate task codigofacilito say_hello
Al ejecutar el comando obtenemos como resultado un nuevo archivo .rb dentro de la carpeta lib/taks.
El archivo contendría la siguiente estructura.
namespace :codigofacilito do
desc "TODO"
task say_hello: :environment do
end
end
Otra forma de definir una tarea es de la siguiente manera (Esta me agrada más).
task :say_hello do
end
Ahora, programemos algo bastante sencillo, un clásico hola mundo.
namespace :codigofacilito do
desc "Se debe imprimir en consola el mensaje: Hola Mundo"
task say_hello: :environment do
puts "Hola Mundo"
end
end
Para llamar a la tarea basta con ejecutar el siguiente comando.
bin/rake codigofacilito:say_hello
Colocamos el namespace dos puntos y el nombre de la tarea.
Es importante mencionar que dentro de un mismo namespace podemos tener la n cantidad de tareas que necesitemos, claro, todas ellas deben tener cierto grado de relación. Siempre tengamos nuestro código lo más ordenado posible. 😛
rails generate task namespace tarea1 tarea2 tarea3 etc...
Algo que me agrada mucho de las tareas es la posibilidad de ejecutar jobs y pruebas unitarias.
task :update_progress => :environment do
UpdateProgressJob.set(wait: 10.seconds).perform_later
end
En este caso la lógica la colocamos dentro de nuestro job, la tarea de lo único que se encarga es de ejecutarlo.
Comandos básicos
Rake nos ofrece una serie de comandos los cuales serán de mucha ayuda al momento de trabajar con tareas.
- rake -T (Lista todas las tareas en la aplicación)
- rake -P (Lista todas las tareas en la aplicación junto con sus dependencias)
Ejemplos
#Listamos todas las tareas
rake -T
#Listamos todas las tareas del namespace codigofacilito
rake -T codigofacilito
Concatenar tareas
En ocasiones tendremos la necesidad de crear tareas las cuales dependan de otras. En esos caso debemos modificar un poco la estructura de nuestras tareas, veamos.
desc "Imprime en consola task1"
task task1: :environment do
puts "task1"
end
desc "Ejecuta la tarea task1 e imprime en consola task2"
task :task2 => :task1 do
puts "task2"
end
En este caso indicamos que la tarea task2 se ejecutará justo después de finalizar la tarea task1.
rake codigofacilito2:task2
task1
task2
Si nuestra tarea depende de más de una, entonces nos apoyamos de una lista.
desc "Imprime en consola task1"
task task1: :environment do
puts "task1"
end
desc "Imprime en consola task2"
task task2: :environment do
puts "task2"
end
desc "Ejecuta task1, task2 e imprime en consola task3"
task :task3 => [:task1, :task2] do
puts "task3"
end
El orden de ejecución es de izquierda a derecha.
Si debemos ejecutar tareas que se encuentran en un namespace diferente simplemente lo indicamos mediante un string.
task :task2 => 'namespace:task1' do
Pasando argumentos
Aunque las tareas sean procesos bien definidos muy probablemente necesiten de ciertos parámetros para su correcta ejecución. Afortunadamente Rake tiene esto está cubierto. 😯
desc "Imprime en consola el valor del nombre "
task :task4, [:first_name, :last_name] do |t, args|
puts "Hola #{args.first_name} #{args.last_name}"
end
Para este ejemplo definimos una nueva tarea con dos parámetros. first_name y last_name. Tendremos acceso a dichos valores mediante el objeto args.
Los parámetros los colocaremos dentro de una lista, separados mediante una coma.
Para llamar a la función y pasar los argumentos simplemente colocamos los valores dentro de una lista y separamos los valores mediante una coma. Ten mucho cuidado de no dejar espacios entre los argumentos.
rake codigofacilito2:task4['Codi','Facilito]