Rake is a software
task management and a
build automation
Build automation is the practice of building software systems in a relatively unattended fashion. The build is configured to run with minimized or no software developer interaction and without using a developer's personal computer. Build automati ...
tool created by
Jim Weirich. It allows the user to specify tasks and to describe dependencies as well as to group tasks into namespaces. It is similar to
SCons
SCons is a software development tool that analyzes source code dependencies and operating system adaptation requirements from a software project description and generates final binary executables for installation on the target operating system pla ...
and
Make. Rake was written in
Ruby
Ruby is a pinkish-red-to-blood-red-colored gemstone, a variety of the mineral corundum ( aluminium oxide). Ruby is one of the most popular traditional jewelry gems and is very durable. Other varieties of gem-quality corundum are called sapph ...
and has been part of the standard library of Ruby since version 1.9.
Examples
The tasks that should be executed need to be defined in a configuration file called Rakefile. A Rakefile has no special syntax and contains executable Ruby code.
Tasks
The basic unit in Rake is the task. A task has a name and an action block, that defines its functionality. The following code defines a task called greet that will output the text "Hello, Rake!" to the console.
task :greet do
puts "Hello, Rake!"
endWhen defining a task, you can optionally add dependencies, that is one task can depend on the successful completion of another task. Calling the "seed" task from the following example will first execute the "migrate" task and only then proceed with the execution of the "seed" task.
task :seed => :migrate do
# This task will run after the :migrate task
end
Tasks can also be made more versatile by accepting arguments. For example, the "generate_report" task will take a date as argument. If no argument is supplied the current date is used.
task :generate_report, datedo , t, args,
report_date = args date, , Date.today
# Generate the report based on the specified date
end
A special type of task is the file task, which can be used to specify file creation tasks. The following task, for example, is given two object files, i.e. "a.o" and "b.o", to create an executable program.
file "prog" => a.o", "b.o"do , t,
sh "cc -o # #"
end
Another useful tool is the directory convenience method, that can be used to create directories upon demand.
directory "testdata/examples/doc"
Rules
When a file is named as a prerequisite but it does not have a file task defined for it, Rake will attempt to synthesize a task by looking at a list of rules supplied in the Rakefile. For example, suppose we were trying to invoke task "mycode.o" with no tasks defined for it. If the Rakefile has a rule that looks like this:
rule '.o' => '.c' do , t,
sh "cc # -c -o #"
end
This rule will synthesize any task that ends in ".o". It has as a prerequisite that a source file with an extension of ".c" must exist. If Rake is able to find a file named "mycode.c", it will automatically create a task that builds "mycode.o" from "mycode.c". If the file "mycode.c" does not exist, Rake will attempt to recursively synthesize a rule for it.
When a task is synthesized from a rule, the source attribute of the task is set to the matching source file. This allows users to write rules with actions that reference the source file.
Advanced rules
Any regular expression may be used as the rule pattern. Additionally, a proc may be used to calculate the name of the source file. This allows for complex patterns and sources.
The following rule is equivalent to the example above:
rule(/\.o$/ =>
->(t_name)) do , t,
sh "cc # -c -o #"
end
NOTE: Because of a quirk in Ruby syntax, parentheses are required around a rule when the first argument is a regular expression.
The following rule might be used for Java files:
rule '.class' => ->(t_name) do , t,
java_compile(t.source, t.name)
end
Namespaces
To better organize big Rakefiles, tasks can be grouped into namespaces.
Below is an example of a simple Rake recipe:
namespace :cake do
desc 'make pancakes'
task :pancake => flour,:milk,:egg,:baking_powderdo
puts "sizzle"
end
task :butter do
puts "cut 3 tablespoons of butter into tiny squares"
end
task :flour => :butter do
puts "use hands to knead butter squares into 1 1/2 cup flour"
end
task :milk do
puts "add 1 1/4 cup milk"
end
task :egg do
puts "add 1 egg"
end
task :baking_powder do
puts "add 3 1/2 teaspoons baking powder"
end
end
See also
*
Make
*
Apache Maven
Maven is a build automation tool used primarily for Java projects. Maven can also be used to build and manage projects written in C#, Ruby, Scala, and other languages. The Maven project is hosted by The Apache Software Foundation, where it was ...
*
Apache Ant
Apache Ant is a software tool for automating software build processes for Java applications which originated from the Apache Tomcat project in early 2000 as a replacement for the Make build tool of Unix. It is similar to Make, but is implement ...
References
External links
Rake documentation
{{DEFAULTSORT:Rake (Software)
Programming tools
Build automation
Software using the MIT license
Ruby (programming language)