【问题标题】:Why is this gem not adding rake tasks to a Rails app?为什么这个 gem 不向 Rails 应用程序添加 rake 任务?
【发布时间】:2016-06-21 10:35:39
【问题描述】:

我们有a gem,它通过 Rake 任务运行。该任务在lib/tasks/<namespace>.rake 中定义。阅读Rake tasks inside gem not being found 后,我确认.gemspec 包含定义任务的文件;正如including rake tasks in gems 中所建议的那样,还有a railtie which should be including the tasks。然而,我们的 Rails 4.1 应用程序似乎没有加载 Rake 任务。

我错过了什么?

【问题讨论】:

    标签: ruby-on-rails rubygems rake bundler


    【解决方案1】:

    我刚刚成功测试了你的 gem,我发现其中的 rake 任务没有问题:

    • 我将 gem_fresh 添加到 Gemfile 并运行 bundle,gem 已安装
    • 我立即可以在 rake 列表中看到 rake:

      $ rake -T outdated
      rake gem_fresh:outdated  # outdated
      
    • 然后我更新railtie.rb文件以使用load方法加载lib/task/metrics.rake中定义的rake并再次搜索可用的rake:

      # lib/gem_fresh/railtie.rb:
      rake_tasks do
        namespace :gem_fresh do
          desc "outdated"
          task :outdated => :environment do
            GemFresh::Reporter.new.report
          end
        end
      
        load "tasks/metrics.rake"
      end 
      
      $ rake -T outdated
      rake gem_fresh:outdated     # outdated
      rake metrics:outdated_gems  # display outdated gem version metrics
      

    所以,我认为您的 gem 没有问题。 railtie 中的两种方法(内联 rake 以及使用 load 方法)似乎都可以正常工作。我注意到的唯一区别是我在 rails 4.2 上对此进行了测试,但我很怀疑这会有所作为。

    您是否将 gem 放入您的 Gemfile 中?如果我从那里删除它,我确实看到没有定义 gem_fresh 耙子。

    【讨论】:

    • 你让我找到了答案!
    【解决方案2】:

    问题不在于 gem,而在于它包含在应用程序中的方式。

    Gemfile 中,这可以工作并包括 rake 任务:

    gem 'gem_fresh'
    

    这可行,但包括 rake 任务:

    group :development do
      gem 'gem_fresh'
    end
    

    这似乎是由于 Bundler 在 Rails 应用程序中需要 gem。 From the documentation:

    默认情况下,Rails 生成的应用在 application.rb 中调用 Bundler.require(:default, Rails.env),它将 Gemfile 中的组链接到 Rails 环境。

    如果由于某种原因 Rails.env 参数没有评估包含 :development 组,当我调用 rake -T 时似乎就是这种情况,则 gem 不会是 Bundler.require-d,并且不会加载 rake 任务。

    它不包括 :development 组的事实似乎是一个奇怪的 Bundler “陷阱”,但至少现在我知道将它移到默认组可以解决问题,这不是 gem 的问题.

    【讨论】:

      【解决方案3】:

      在我的例子中,需要 gem 的项目有一个 rake 文件,当我更改 rake 文件的名称时,我需要的 gem 具有相同的名称,我可以看到项目中的任务。

      my_gem 有 lib/tasks/XXXX.rake,my_proj 也有 lib/tasks/XXXX.rake, 在我将 my_gem XXXX.rake 更改为 YYYY.rake 后,我设法列出并使用了 YYYY.rake 中的任务

      【讨论】:

        猜你喜欢
        • 2012-04-21
        • 2012-07-13
        • 2015-05-07
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多