[英]Including rake tasks in gems
1)宝石里面有耙子任务的“最佳”位置吗? 我在/tasks
, /lib/tasks
看到过它们,我看到它们写成*.rb
和*.rake
- 不确定哪个(如果有的话)是'正确的'
2)在环境中配置gem后,如何将它们提供给应用程序?
在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'
因为我的gem的/lib
目录在加载路径中。
/tasks
和lib/tasks
都是个好地方。 我用/tasks
时,任务意味着用作营运或管理的宝石本身,我用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 }
对于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语句之后。
笔记:
我还没有找到更容易的东西。 评论?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.