Make rake task from gem available everywhere?

后端 未结 5 1935
独厮守ぢ
独厮守ぢ 2020-12-24 07:17

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 r

相关标签:
5条回答
  • 2020-12-24 07:31

    That's what Sake is for. Datamapper and Merb have been using Sake with success.

    0 讨论(0)
  • 2020-12-24 07:34

    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.

    0 讨论(0)
  • 2020-12-24 07:35

    Check out the rdoctask in rake for an example of how to define a task provided by a gem. The task is defined in ruby instead of the rake build language and can be required like so:

    require 'rake'             # the gem
    require 'rake/rdoctask'    # the task
    
    0 讨论(0)
  • 2020-12-24 07:38

    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
    
    0 讨论(0)
  • 2020-12-24 07:46

    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.

    0 讨论(0)
提交回复
热议问题