包括在gem中的耙子任务

1)gem里面的耙子任务有没有“最好”的地方? 我在/ tasks,/ lib / tasks中看过他们,而且我看到他们写成* .rb和* .rake – 不知道哪个(如果有的话)是“正确的”

2)一旦在环境中configuration了gem,我应该如何使它们可用?

在Rails 3上,你通过Railties来做到这一点。 下面是代码来做我刚刚做的gem:

class BackupTask < Rails::Railtie rake_tasks do Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f } end end 

所以你基本上创build一个从Rails :: Railtieinheritance的类,然后在这个类中你有一个rake_tasks块加载相关的文件。 如果要使用.rake扩展名,则必须加载而不是require。

我发现我需要指定Dir的完整path(因此File.join体操)。 如果我只是想明确列出文件,那么我只能说“加载”任务/ foo.rake“”,因为我的gem的lib目录是在加载path。

/taskslib/tasks是一个好地方。 当任务是用来工作或pipe理Gem本身时,我使用lib/tasks当任务是由Gem用户加载时,我使用lib/tasks

这是因为用户在加载ruby文件时可能会遇到一些问题,这些文件会在需要的时候自动附加到加载path上。

另外,我build议你使用* .rake扩展名。 现在,几乎每个IDE都将.rake扩展名与.rake文件相关联,大多数高级IDE甚至可以将内容parsing为rake脚本。 .rake扩展名对于开发人员来说也是更好的select,因为您可以立即提供文件内的内容。

关于第二个问题,当插件被打包为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的支持,gem安装程序将不得不编辑他们的Rakefile并添加:

 Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext } 

在要求陈述之后。

笔记:

  • 一定要用你实际的gem的名字来代替。
  • 这假定所有Rails可见的rake任务都在lib / tasks /

我还没有find任何更容易的。 注释?