2

我正在编写一个包含一些 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
4

1 回答 1

1

Rake仅在 rake 上下文中定义。

所以,你可以简单地去做这样的事情:

if defined? Rake
   # rake specific stuff
else
   # non rake stuff
end

编辑 :

虽然这将与 完美配合rails s,但 zeus 在开发环境中存在问题:zeus 将需要 rake。

如果这是一个问题,如果认为您可以利用Rake.application ,它会在执行 rake 任务时设置一个实例变量。

我已经在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
于 2013-09-20T14:23:06.200 回答