Ruby Rake Tutorial

Introduction

The rake utility and Rakefile are Ruby's version of make and Makefile. Personally, I find rake much more pleasant to work with than make. While it is written in Ruby, you can use it as task runner for a project of any language.

Rake was created originally by the late Jim Weirich who can has a lecture on the topic from RailsCons 2012:


Install rake

You can check if rake is installed by running one of the following:

rake --help
ruby -S rake --help

If you need to install rake, see your operating system's available packages, or install it using gem:

gem install rake

If you are interested in building from source, you can find it on on GitHub: https://github.com/ruby/rake

Basic rake commands

Here are a few basic rake commands. See rake --help for more details. By default, rake will look for a Rakefile in your current directory. The next section provides an example Rakefile that defines a few tasks.

# Run default task in Rakefile
rake
# Don't actually execute tasks
rake --dry-run
# Execute a specific job
rake <target_name>

Example Rakefile

Here is an example Rakefile that has some basic procedures for building and installing a Debian package .deb. Just run rake inside the directory with the Rakefile.

This is a modified example from a real build project of mine. I have commented out the actual shell commands so that this file can be copy/pasted and used to run rake commands without making any system changes. I left the example commands there there though to demonstrate how you can make use of shell commands by using the backticks. This demonstrates how you can easily convert a Makefile to a Rakefile by still calling the same underlying shell commands while still getting the power of Ruby and improved readability.

task default: [:clean, :build, :install]

task :clean do
    puts "Cleaning packages"
    # `rm *.deb`
end

task :build do
    puts "Building mypackage-0.0.0"
    # `dpkg -b ./mypackage-0.0.0 ./mypackage-0.0.0.deb`
    puts 'Try `rake install` now.'
end

task :uninstall do
    puts 'Uninstalling mypackage'
    # `sudo apt-get remove -y mypackage`
end

task :install => [:uninstall] do
    puts 'Installing mypackage-0.0.0'
    # `sudo apt-get install -y ./mypackage-0.0.0.deb`
end

Example usage of the above Rakefile:

rake # runs default task (all the steps)
rake clean
rake build
rake uninstall
rake install

Conclusion

You should have a basic understanding of how to use rake and create a simple Rakefile. Rake has several more powerful features that aren't covered here and I encourge further reading on the topic.

References