【问题标题】:Including rake tasks in gems在 gems 中包含 rake 任务
【发布时间】:2010-12-25 02:51:12
【问题描述】:

1) 在 gems 中是否有一个“最好”的地方来执行 rake 任务?我在/tasks/lib/tasks 中看到它们,并且我看到它们写成*.rb*.rake——不确定哪个(如果有)是“正确的”

2) 在环境中配置 gem 后,如何使它们对应用程序可用?

【问题讨论】:

  • 应该继续追求更好的答案——当我试图让 facebooker 工作时,我撞到了墙上——这可以作为 gem 使用,但它不起作用,因为所有 rake 任务依赖项基本上都死了.
  • 这对我有帮助:blog.nathanhumbert.com/2010/02/…

标签: ruby-on-rails ruby rubygems rake


【解决方案1】:

在 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

所以你基本上创建了一个继承自Rails::Railtie 的类,然后在该类中你有一个rake_tasks 块来加载相关文件。如果你想使用 .rake 扩展,你必须加载而不是 require。

我发现我需要指定Dir 的完整路径(因此是File.join 体操)。如果我只是想明确列出文件,那么我可以只说 load 'tasks/foo.rake' 就可以逃脱,因为我的 gem 的 /lib 目录在加载路径中。

【讨论】:

  • 你知道如何将 rake 任务添加到非 Rails 项目中吗?
  • +1 对于 Rails 4 中的此响应,它有据可查 here。对于非导轨,请参阅this post
【解决方案2】:

/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 文件夹中,那么 tasks 和 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 }

【讨论】:

  • 我应该把这两条以 Dir 开头的行放在哪里?这个答案对 Rails 4 仍然有效吗?
  • 这个答案的前半部分很棒。后半部分似乎早于 Rails 3 并且已经过时了。正如@edebill 的回答所解释的那样,使用 railtie 让 Rails 加载任务。
【解决方案3】:

对于 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/ 中

我还没有找到更简单的方法。评论?

【讨论】:

    猜你喜欢
    • 2014-12-05
    • 2020-09-07
    • 1970-01-01
    • 2011-02-04
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多