1)宝石中的耙子任务是否有“最佳”的位置?我在/tasks
,/lib/tasks
中看过它们,我看到它们写成*.rb
和*.rake
- 不确定哪个(如果有的话)是'正确的'
2)在环境中配置gem之后,如何将它们提供给应用程序?
答案 0 :(得分:44)
在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
体操)。如果我只是想明确地列出文件,那么我就可以说load 'tasks/foo.rake'
只是因为我的宝石的/lib
目录在加载路径中。
答案 1 :(得分:31)
/tasks
和lib/tasks
都是个好地方。当任务用于工作或管理Gem本身时,我使用/tasks
,当任务由Gem用户加载时,我使用lib/tasks
。
这是因为用户在加载lib
文件夹之外的ruby文件时可能会遇到一些问题,当需要Gem时,该文件会自动附加到加载路径。
另外,我建议你使用* .rake扩展名。现在几乎每个IDE都将.rake
扩展名与ruby文件相关联,而大多数高级IDE甚至可以将内容解析为rake脚本。 .rake
扩展名对于开发人员来说也是更好的选择,因为您可以立即提供文件内容的概述。
关于你的第二个问题,当插件被打包为Gem时,目前没有办法让Rails加载你的rake任务。您需要在应用程序中包含rake文件(在其他rake文件或主Rakefile中)或克隆项目中的rake任务。
如果您在vendor文件夹中安装插件,则任务和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 }
答案 2 :(得分:11)
对于Rails 3支持,lib / .rb文件的第一行可以是:
Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake)
对于Rails 2支持,gem安装程序必须编辑他们的Rakefile并添加:
Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext }
在require语句之后。
注意:
我还没有找到更容易的东西。评论