Reputation: 9945
So I'm writing a small gem and I have a '/tasks' dir in it with some specific rake tasks. How do I make those tasks available automatically everywhere, where the gem is required? For example I wish I could run 'rake mygemrake:task' inside my rails root dir after I have the gem installed.
Upvotes: 33
Views: 9430
Reputation: 33239
That's what Sake is for. Datamapper and Merb have been using Sake with success.
Upvotes: 0
Reputation: 1546
For Rails3 applications, you might want to look into making a Railtie for your gem.
You can do so with:
lib/your_gem/railtie.rb
require 'your_gem'
require 'rails'
module YourGem
class Railtie < Rails::Railtie
rake_tasks do
require 'path/to/rake.task'
end
end
end
lib/your_gem.rb
module YourGem
require "lib/your_gem/railtie" if defined?(Rails)
end
Though, I had my share of difficulties with requiring the rake.task
file in my railtie.rb
. I opted to just define my measley one or two tasks within the rake_tasks
block.
Upvotes: 21
Reputation: 735
You can write normal rake tasks for a gem and load them like this:
require 'rake'
load 'path/to/your/tasks.rake'
Also, take a look at thor vs. rake.
Upvotes: 0
Reputation: 12675
You have to import those tasks in application's Rakefile. This is how it looks in mine (I am using bundler08 to manage my gems):
%w(gem1 gem2 gem3).each do |g|
Dir[File.dirname(__FILE__) + "/vendor/bundler_gems/**/#{g}*/tasks/*.rake"].each do |f|
import f
end
end
Upvotes: 0