繁体   English   中英

在宝石中包括rake任务

[英]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目录在加载路径中。

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

笔记:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM