1)宝石中的耙子任务有没有“最好”的地方?我已经在/ tasks/lib/tasks中看到过它们,并且我将它们看作* .rb和* .rake - 不确定哪个(如果有的话)是'正确'包括宝石中的耙子任务
2)如何一旦在环境中配置了gem,我将它们提供给应用程序?
1)宝石中的耙子任务有没有“最好”的地方?我已经在/ tasks/lib/tasks中看到过它们,并且我将它们看作* .rb和* .rake - 不确定哪个(如果有的话)是'正确'包括宝石中的耙子任务
2)如何一旦在环境中配置了gem,我将它们提供给应用程序?
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目录在加载路径中。
你知道如何将rake任务添加到非rails项目中吗? – lulalala 2013-09-04 08:59:59
对于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
确认在rails 4.2上工作 – equivalent8 2015-05-28 14:43:07
/tasks
和lib/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 }
为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语句。
注:
我还没有发现任何东西更容易呢。注释?
应该继续追求更好的答案 - 当我试图让facebooker工作时,我还碰到了我的头 - 这可以作为宝石使用,但它不起作用,因为所有rake任务依赖关系基本上都是死的。 – 2010-01-10 14:26:53
这对我有帮助:http://blog.nathanhumbert.com/2010/02/rails-3-loading-rake-tasks-from-gem.html – User 2013-04-16 10:21:10