Rake tasks from a Rubygem
While recently working on IronHide, specifically the CouchDB Adapter, I needed a way to have the gem expose custom Rake tasks to an end user’s application.
For example, to make working with the IronHide CouchDB Adapter easier, I wanted to allow users to upload existing rules from disk to a remote CouchDB database.
The task could be something as simple as:
$ bundle exec rake iron_hide:load_rules\['/absolute/path/file.json','http://127.0.0.1:5984/rules'\]
where the two arguments are the path to the JSON file and the remote CouchDB database.
Bundler #
After thinking for a moment, I knew that I’ve come across at least one gem that when included, exposes Rake tasks that I can use in my project, Bundler. So, I started looking through the source and found this: https://github.com/bundler/bundler/blob/master/lib/bundler/gem_helper.rb
Essentially, you’d like an application owner to be able to “install” a few Rake tasks at their convenience. Borrowing from the Bundler
project:
# iron_hide/couchdb_tasks.rb
module IronHide
class CouchDbTasks
include Rake::DSL if defined? Rake::DSL
def install_tasks
namespace :iron_hide do
desc 'Load rules from local JSON file to remote CouchDB server'
task :load_rules, :file, :db_server do |t, args|
...
end
end
end
end
end
IronHide::CouchDbTasks.new.install_tasks
Now, in my application’s Rakefile
I just need to add this line:
# Rakefile
require 'iron_hide/couchdb_tasks'
Et voila!
$ bundle exec rake -T
#=> rake iron_hide:load_rules[file,db_server] # Load rules from local JSON