我们有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任务。
我错过了什么?
答案 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中的任务