我正在写一个包含一些rake任务的gem。我在before_configuration方法中有一些代码,我希望在运行时由应用程序加载我的gem时运行,但不是在使用rake运行任务时。我该如何确定?
LIB / mygem / tasks.rake:
namespace :mygem do
task :dosomething do
puts "DONE"
end
end
LIB / mygem / railtie.rb:
require "rails"
module Mygem
class Railtie < ::Rails::Railtie
config.before_configuration do
#is_rake_task = ?
if !is_rake_task
# Do something
end
end
end
end
答案 0 :(得分:1)
Rake
仅在rake上下文中定义。
所以,你可以简单地这样做:
if defined? Rake
# rake specific stuff
else
# non rake stuff
end
编辑:
虽然这与rails s
完全兼容,但是zeus在开发环境上存在问题:zeus需要rake。
如果这是一个问题,如果您认为可以利用Rake.application,a rake task is executed会在{{3}}时设置实例变量。
我在zeus s
上下文中对此进行了测试:
> Rake.instance_variable_defined? :@application
false
在rake <task>
上下文中:
> Rake.instance_variable_defined? :@application
true
因此,一个完整的解决方案是:
if defined?( Rake ) and Rake.instance_variable_defined?( :@application )
# rake specific stuff
else
# non rake stuff
end