【问题标题】:Determining whether gem was called as Rake task确定 gem 是否被称为 Rake 任务
【发布时间】:2013-09-20 14:08:28
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby rubygems rake rake-task


    【解决方案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 时设置一个实例变量。

    我已经在 zeus s 上下文中对此进行了测试:

    > Rake.instance_variable_defined? :@application
    false
    

    rake &lt;task&gt; 上下文中:

    > Rake.instance_variable_defined? :@application
    true
    

    所以,一个完整的解决方案是:

    if defined?( Rake ) and Rake.instance_variable_defined?( :@application )
       # rake specific stuff
    else
       # non rake stuff
    end
    

    【讨论】:

    • 就像一个魅力 - 谢谢!
    • @OlivierElMekki- 事实证明这有问题。从控制台 (rails server) 运行开发中的应用程序时,Rake 定义,因此无法区分...
    • 在我当前的应用程序中不是这种情况(rails-4.0.0,用普通的rails sbundle exec rails s 都试过了)。您的 gem 集中没有任何 lib 加载 rake 吗?
    • 好吧,再做一些测试:我对rails s没有问题,对上帝发射独角兽也没有问题,但我确实发现zeus s有问题。我想这是因为zeus start 中的“development_environment > prerake”行。你在用宙斯吗?
    • 好的,也为宙斯找到了一个方法。有趣的问题 :) 不过,我不确定我们应该如何看待 zeus 在服务器进程中加载​​ rake。
    猜你喜欢
    • 2020-09-07
    • 2011-02-11
    • 1970-01-01
    • 2012-07-13
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    相关资源
    最近更新 更多