【问题标题】:Make rake task from gem available everywhere?让 gem 的 rake 任务随处可用?
【发布时间】:2009-04-12 23:27:42
【问题描述】:

所以我正在编写一个小 gem,其中有一个“/tasks”目录,其中包含一些特定的 rake 任务。如何在需要 gem 的地方自动使这些任务可用?例如,我希望在安装 gem 后,我可以在我的 rails 根目录中运行 'rake mygemrake:task'。

【问题讨论】:

    标签: ruby rake


    【解决方案1】:

    对于 Rails3 应用程序,您可能需要考虑为您的 gem 制作 Railtie。

    您可以这样做:

    lib/your_gem/railtie.rb

    require 'your_gem'
    require 'rails'
    module YourGem
      class Railtie < Rails::Railtie
        rake_tasks do
          require 'path/to/rake.task'
        end
      end
    end
    

    lib/your_gem.rb

    module YourGem
      require "lib/your_gem/railtie" if defined?(Rails)
    end
    

    不过,在我的railtie.rb 中要求rake.task 文件时,我遇到了一些困难。我选择在 rake_tasks 块中定义我的 measley 一两个任务。

    【讨论】:

    • 请注意,我无法让 Rails 使用此方法要求带有 .rake 扩展名的 rake 任务。
    • 我想我记得错误类似于这里描述的内容:blog.smartlogicsolutions.com/2009/05/26/… 也许使用import 而不是require 是成功的关键?我会深入研究下一次有空闲时间的机会:)
    • @BenjaminOakes 你也可以用load替换requireload "path/to/file.rake"
    • 大家好,有没有一种方法可以在不需要 Rails 的情况下创建 rake 任务?
    • @nisevi 在不需要 Rails 的情况下创建 rake 任务非常好,例如github.com/kjvarga/sitemap_generator/blob/master/lib/…
    【解决方案2】:

    查看 rake 中的 rdoctask 以获取有关如何定义 gem 提供的任务的示例。该任务是在 ruby​​ 而不是 rake 构建语言中定义的,并且可以像这样要求:

    require 'rake'             # the gem
    require 'rake/rdoctask'    # the task
    

    【讨论】:

      【解决方案3】:

      您必须在应用程序的 Rakefile 中导入这些任务。这是我的样子(我正在使用 bundler08 来管理我的 gem):

      %w(gem1 gem2 gem3).each do |g|
        Dir[File.dirname(__FILE__) + "/vendor/bundler_gems/**/#{g}*/tasks/*.rake"].each do |f|
          import f
        end
      end
      

      【讨论】:

        【解决方案4】:

        您可以为 gem 编写正常的 rake 任务并像这样加载它们:

        require 'rake'
        load 'path/to/your/tasks.rake'
        

        另外,看看thor vs. rake

        【讨论】:

          【解决方案5】:

          这就是Sake 的用途。 Datamapper 和 Merb 一直在成功使用 Sake。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-24
            • 1970-01-01
            • 2018-02-20
            • 1970-01-01
            相关资源
            最近更新 更多