Ruby On Rails - Part Four - Rake
I have always been interested in automating common development tasks. I have used Ant, Maven, and Nant pretty extensively and now I’m learning the details of Rake. There’s something special about seeing messages fly by in a command shell, and know that the computer is doing all these repetitive tasks — not you!
What is different about Rake then any of the others build tools mentioned is that you create a Rakefile by writing Ruby code, instead of using xml. There is a
I would recommend you read this excellent article on defmacro.org (take your time and read through it — it’s really worth it) that does a good job of explaining the benefits of Lisp. A cool thing, since we’re talking about build automation, is one section, titled “Ant Reloaded”, talks about how Java could have been used instead of XML. In our case it’s Ruby being used in a Rakefile.
This tutorial is written by the developer of Rake, and is a good tour through the main features of Rake. I would suggest you read it first, followed by this article by Martin Fowler which reviews some examples of interesting things you can do with a Rakefile.
I created a simple example Rakefile. I’m sure no one would actually need a script like this, but the simple scenario was good for an example of how to use Rake.
I’ve included the code below, the formatting is off because I pasted it in my blog editor, but I hope it will be a good example to someone just getting started with Rake. If you have any suggestions on how to improve this simple Rakefile example, please add a comment to this post.
# ———————————————————-
# This is just an example to illustrate how to use Rake
# By Rob Herbst
# ———————————————————-
# Require rake/clean to get the built in clean task
require ‘rake/clean’
# Require ftools to get File.copy
require ‘ftools’
# Define constants we’ll use later
HTML_SRC_DIR = “html”
WEB_DEST_DIR = “website”
IMAGES_DIR = “images”
SITE_MAP = “sitemap.html”
HTML_SRC_FILES = FileList[“#{HTML_SRC_DIR}/*.html”]
IMAGE_SRC_FILES = FileList[“#{HTML_SRC_DIR}/*.jpg”]
# Add the WEB_DEST_DIR to the list to get cleaned
CLEAN.include(WEB_DEST_DIR)
# The default task depends upon the package task
task :default => [:package]
# The package task depends upon clean, create structure, and the task to create the site map file.
task :package => [:clean, :create_structure, :sitemap] do
puts “The package task was called.”
# Copy over the html files
HTML_SRC_FILES.each do |f|
File.copy(“#{f}”, “#{WEB_DEST_DIR}”)
end
# Copy over the image files
IMAGE_SRC_FILES.each do |f|
File.copy(“#{f}”, “#{WEB_DEST_DIR}/images”)
end
end
# Utility task to create the structure of the website
task :create_structure do
puts “The create_structure task was called.”
Dir.mkdir(WEB_DEST_DIR)
Dir.chdir(WEB_DEST_DIR)
Dir.mkdir(IMAGES_DIR)
Dir.chdir(“..”)
end
# Task to create the sitemap.html file
task: :sitemap do
open(“#{WEB_DEST_DIR}/#{SITE_MAP}”, “w”) do |outs|
outs.puts “<html><head>Site Map</head><body><ul>”
HTML_SRC_FILES.each do |f|
file_name = f.sub(HTML_SRC_DIR + “/”, “”)
outs.puts “<li><a href=\”#{file_name}\”>#{file_name}</></li>”
end
outs.puts “</ul></body>”
end
end

