jsh*_*rpe 59 ruby rake rubygems ruby-on-rails
1)宝石里面有耙子任务的"最佳"位置吗?我见过它们/tasks,/lib/tasks我看到它们写成了- *.rb并且*.rake不确定哪个(如果有的话)是'正确的'
2)在环境中配置gem后,如何将它们提供给应用程序?
ede*_*ill 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
Run Code Online (Sandbox Code Playgroud)
所以你基本上创建了一个继承自的类Rails::Railtie,然后在该类中你有一个rake_tasks加载相关文件的块.如果要使用.rake扩展名,则必须加载而不是require .
我发现我需要指定完整的路径Dir(因此是File.join体操).如果我只是想明确地列出文件,那么我就可以说,load 'tasks/foo.rake'因为/lib我的宝石的目录是在加载路径中.
Sim*_*tti 31
无论是/tasks和lib/tasks是个好地方.我使用/tasks的任务是用于工作或管理Gem本身,我lib/tasks在Gem用户加载任务时使用.
这是因为用户在加载文件lib夹外部的ruby文件时可能会遇到一些问题,当需要Gem时会自动将其附加到加载路径.
另外,我建议你使用*.rake扩展名.如今几乎每个IDE都将.rake扩展名与ruby文件相关联,而大多数高级IDE甚至可以将内容解析为rake脚本..rake对于开发人员来说,扩展名是更好的选择,因为您可以立即提供文件内容的概述.
关于你的第二个问题,当插件被打包为Gem时,目前没有办法让Rails加载你的rake任务.您需要在应用程序中包含rake文件(在其他rake文件或主Rakefile中)或克隆项目中的rake任务.
如果在vendor文件夹中安装插件,则*.rake任务和lib/tasks目录中的所有文件将通过以下两行自动加载到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 }
Run Code Online (Sandbox Code Playgroud)
Ste*_*oka 12
对于Rails 3支持,lib/.rb文件的顶行可以是:
Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake)
Run Code Online (Sandbox Code Playgroud)
对于Rails 2支持,gem安装程序必须编辑他们的Rakefile并添加:
Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext }
Run Code Online (Sandbox Code Playgroud)
在require语句之后.
笔记:
我还没有找到更容易的东西.评论?