【问题标题】:Why is this gem not adding rake tasks to a Rails app?为什么这个 gem 不向 Rails 应用程序添加 rake 任务?
【发布时间】:2016-06-21 10:35:39
【问题描述】:
【问题讨论】:
标签:
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 中的任务