在宝石中包括rake任务

时间:2009-12-10 04:29:08

标签: ruby-on-rails ruby rubygems rake

1)宝石中的耙子任务是否有“最佳”的位置?我在/tasks/lib/tasks中看过它们,我看到它们写成*.rb*.rake - 不确定哪个(如果有的话)是'正确的'

2)在环境中配置gem之后,如何将它们提供给应用程序?

3 个答案:

答案 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)

/taskslib/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语句之后。

注意:

  • 请务必使用实际宝石的名称替换。
  • 这假设所有Rails可见的rake任务都在lib / tasks /

我还没有找到更容易的东西。评论