Rake es una herramienta de automatización de compilación y gestión de tareas de software creada por Jim Weirich . Permite al usuario especificar tareas y describir dependencias, así como agrupar tareas en espacios de nombres. Es similar a SCons y Make . Rake fue escrito en Ruby y ha sido parte de la biblioteca estándar de Ruby desde la versión 1.9. [2] [3]
Las tareas que deben ejecutarse deben definirse en un archivo de configuración llamado Rakefile. Un Rakefile no tiene una sintaxis especial y contiene código Ruby ejecutable. [4]
La unidad básica en Rake es la tarea. Una tarea tiene un nombre y un bloque de acción que define su funcionalidad. El siguiente código define una tarea llamada saludo que generará el texto "¡Hola, Rake!" a la consola. [5]
tarea : saludar hacer pone "¡Hola, Rake!" fin
Al definir una tarea, opcionalmente puede agregar dependencias, es decir, una tarea puede depender de la finalización exitosa de otra tarea. Al llamar a la tarea "semilla" del siguiente ejemplo, primero se ejecutará la tarea "migrar" y solo luego se procederá con la ejecución de la tarea "semilla". [5]
tarea :seed => :migrate do # Esta tarea se ejecutará después de que finalice la tarea :migrate
Las tareas también se pueden hacer más versátiles aceptando argumentos. Por ejemplo, la tarea "generate_report" tomará una fecha como argumento. Si no se proporciona ningún argumento, se utiliza la fecha actual. [5]
tarea :generar_report , [ :fecha ] hacer | t , argumentos | fecha_informe = argumentos [ :fecha ] || Fecha . hoy # Generar el informe basado en la fecha de finalización especificada
Un tipo especial de tarea es la tarea de archivo, que se puede utilizar para especificar tareas de creación de archivos. A la siguiente tarea, por ejemplo, se le asignan dos archivos objeto, es decir, "ao" y "bo", para crear un programa ejecutable. [6]
archivo "prog" => [ "ao" , "bo" ] hacer | t | sh "cc -o #{ t . nombre } #{ t . requisitos previos . unirse ( ' ' ) } " fin
Otra herramienta útil es el método de conveniencia del directorio, que se puede utilizar para crear directorios a pedido. [7]
directorio "datos de prueba/ejemplos/doc"
Cuando un archivo se nombra como requisito previo pero no tiene una tarea de archivo definida para él, Rake intentará sintetizar una tarea mirando una lista de reglas proporcionadas en Rakefile. Por ejemplo, supongamos que intentáramos invocar la tarea "mycode.o" sin ninguna tarea definida para ella. Si el Rakefile tiene una regla similar a esta:
regla '.o' => '.c' hacer | t | sh "cc #{ t . fuente } -c -o #{ t . nombre } " fin
Esta regla sintetizará cualquier tarea que termine en ".o". Tiene como requisito previo que debe existir un archivo fuente con extensión ".c". Si Rake puede encontrar un archivo llamado "mycode.c", creará automáticamente una tarea que compila "mycode.o" a partir de "mycode.c". Si el archivo "mycode.c" no existe, Rake intentará sintetizar recursivamente una regla para él.
Cuando una tarea se sintetiza a partir de una regla, el atributo de origen de la tarea se establece en el archivo fuente coincidente. Esto permite a los usuarios escribir reglas con acciones que hacen referencia al archivo fuente. [8]
Se puede utilizar cualquier expresión regular como patrón de regla. Además, se puede utilizar un proceso para calcular el nombre del archivo fuente. Esto permite patrones y fuentes complejos.
La siguiente regla es equivalente al ejemplo anterior:
regla ( /\.o$/ => -> ( t_name ){ t_name . sub /\.o$/ , '.c' }) hacer | t | sh "cc #{ t . fuente } -c -o #{ t . nombre } " fin
NOTA: Debido a una peculiaridad en la sintaxis de Ruby, se requieren paréntesis alrededor de una regla cuando el primer argumento es una expresión regular.
La siguiente regla podría usarse para archivos Java: [9]
regla '.class' => -> ( t_name ){ t_name . sub ( /\.class$/ , '.java' ) . sub ( /^clases\// , 'src/' ) } hacer | t | java_compile ( t . fuente , t . nombre ) fin
Para organizar mejor los Rakefiles grandes, las tareas se pueden agrupar en espacios de nombres. [10] A continuación se muestra un ejemplo de una receta sencilla de rastrillo:
espacio de nombres :cake hacer desc tarea 'hacer panqueques' :pancake => [ :harina , :leche , :egg , :baking_powder ] pone "chisporroteo" finaliza la tarea :butter pone "corta 3 cucharadas de mantequilla en cuadritos pequeños" finaliza la tarea :harina => :mantequilla pone "usa las manos para amasar cuadrados de mantequilla hasta obtener 1 1/2 taza de harina" finaliza la tarea :leche pone "agrega 1 1/4 taza de leche" finaliza la tarea :huevo pone " agrega 1 huevo " final tarea :baking_powder pone "agregar 3 1/2 cucharaditas de polvo para hornear " al final