为什么这个gem没有将rake任务添加到Rails应用程序?

时间:2016-03-07 18:28:06

标签: ruby-on-rails rubygems rake bundler

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

我错过了什么?

3 个答案:

答案 0 :(得分:4)

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

  • 我将gem_fresh添加到Gemfile并运行了bundle,安装了gem
  • 我立即可以看到耙子列表中出现的耙子:

    $ rake -T outdated
    rake gem_fresh:outdated  # outdated
    
  • 然后我更新了railtie.rb文件以使用load方法加载lib/task/metrics.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
    

所以,我可以看到你的宝石没有问题。铁路中的两种方法(内联耙以及使用加载方法)似乎都可以正常工作。我注意到的唯一区别是我在rails 4.2上进行了测试,但我怀疑这会产生影响。

您是否将gem放入Gemfile?如果我从那里删除它,我确实看不到定义gem_fresh rakes。

答案 1 :(得分:4)

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

Gemfile中,这适用于并包括佣金任务:

gem 'gem_fresh'

这有效,但不包含rake任务

group :development do
  gem 'gem_fresh'
end

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

  

默认情况下,Rails在application.rb中生成应用程序调用{​​{1}},它将Gemfile中的组链接到Rails环境。

如果出于某种原因,Bundler.require(:default, Rails.env)论证并未评估包含Rails.env群组,这在我致电:development时似乎就是这种情况,那么宝石就不会#39} ; t为rake -T - d,并且不会加载rake任务。

它不包括Bundler.require组的事实似乎是一个奇怪的Bundler&#34; gotcha&#34;,但至少现在我知道将它移动到默认组解决了这个问题并不是宝石的问题。

答案 2 :(得分:0)

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

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