2009-12-10 44 views
57

1)宝石中的耙子任务有没有“最好”的地方?我已经在/ tasks/lib/tasks中看到过它们,并且我将它们看作* .rb和* .rake - 不确定哪个(如果有的话)是'正确'包括宝石中的耙子任务

2)如何一旦在环境中配置了gem,我将它们提供给应用程序?

+1

应该继续追求更好的答案 - 当我试图让facebooker工作时,我还碰到了我的头 - 这可以作为宝石使用,但它不起作用,因为所有rake任务依赖关系基本上都是死的。 – 2010-01-10 14:26:53

+0

这对我有帮助:http://blog.nathanhumbert.com/2010/02/rails-3-loading-rake-tasks-from-gem.html – User 2013-04-16 10:21:10

回答

44

On Rails 3,你通过Railties来做到这一点。下面的代码做到这一点,因为我刚刚作出了一个宝石:

class BackupTask < Rails::Railtie 
    rake_tasks do 
    Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f } 
    end 
end 

所以你基本上是创建一个从Rails的:: Railtie继承的类,然后在该类中你必须加载相关文件rake_tasks块。如果要使用.rake扩展名,则必须加载而不是require。

我发现我需要指定Dir的完整路径(因此File.join体操)。如果我只是想明确列出文件,那么我就可以说只是说“加载”任务/ foo.rake'“,因为我的宝石的lib目录在加载路径中。

+2

你知道如何将rake任务添加到非rails项目中吗? – lulalala 2013-09-04 08:59:59

+1

对于Rails 4中的这个响应,这里有很好的文档[http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html]。对于非Rails,请参阅[本文](http://stackoverflow.com/questions/13858495/ruby-accessing-rake-task-from-a-gem-without-rails) – zrisher 2014-10-10 02:55:37

+0

确认在rails 4.2上工作 – equivalent8 2015-05-28 14:43:07

31

/taskslib/tasks是个好地方。当任务旨在用于工作或管理Gem本身时,我使用/tasks,当任务旨在由Gem用户加载时,我使用lib/tasks

这是因为用户在加载lib文件夹之外的红宝石文件时可能会遇到问题,该文件夹会在需要时自动附加到加载路径。

此外,我建议你使用* .rake扩展名。现在,几乎每个IDE都将.rake扩展名与Ruby文件相关联,大多数高级IDE甚至可以将内容解析为rake脚本。对于开发人员来说,.rake扩展也是更好的选择,因为您可以立即提供文件内的内容概览。

关于第二个问题,当插件打包为Gem时,目前没有办法让Rails加载您的rake任务。您需要将rake文件包含在您的应用程序中(在其他rake文件或主Rakefile中)或克隆项目中的rake任务。

如果您在供应商文件夹中安装该插件,则任务和lib/tasks目录中的所有*.rake文件都会通过以下两行自动加载到您的Rails作用域中。

Dir["#{RAILS_ROOT}/vendor/plugins/*/tasks/**/*.rake"].sort.each { |ext| load ext } 
Dir["#{RAILS_ROOT}/vendor/plugins/*/lib/tasks/**/*.rake"].sort.each { |ext| load ext } 
+0

我会在哪里将这两行以Dir开头?这个答案对Rails 4仍然有效吗? – Spundun 2014-02-17 03:40:54

+0

这个答案的前半部分很棒。下半场似乎比Rails 3早,并且已经过时。按照@ edebill的答案解释,使用railtie让Rails加载任务。 – drewish 2016-09-27 04:05:46

11

为Rails 3的支持,您的lib/.RB文件的第一行可以是:

Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake) 

为Rails 2的支持,创业板安装程序将不得不修改它们的Rake文件并添加:

Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext } 

之后的require语句。

注:

  • 一定要与您的实际宝石的名称取代。
  • 这是假设所有的Rails可见耙任务是在LIB /任务/

我还没有发现任何东西更容易呢。注释?