2012-11-13 32 views
6

我想用初始化器預先填充我的緩存,但我不需要此代碼在每次運行rakerails g等時運行等等.Rake和Bundler很容易對付,但類似的解決方案沒有爲發電機工作:如何防止初始化器在運行rails生成時運行

# config/initializers/prepop_cache.rb 
if !defined?(::Bundler) and !defined?(::Rake) and !defined(Rails::Generators) 
    # do stuff 
end 

這一定是因爲rails/generators(或類似的東西)是require版在運行時。如何檢查命令運行的是否是rails g xyz

更新:

兩種解決方案可以在這裏找到:Rails 3 initializers that run only on `rails server` and not `rails generate`, etc

仍想知道,如果它在我上面試過的方式是可能的。

回答

1

的Rails 3,你希望做什麼是可以想到的,但在哈克的方式。具體方法如下:

當您進行rails generate呼叫時,CALLPATH看起來是這樣的:

rails/commands,對生成的代碼運行:

ARGV << '--help' if ARGV.empty? 

aliases = { 
    "g" => "generate", 
    "c" => "console", 
    "s" => "server", 
    "db" => "dbconsole" 
} 

command = ARGV.shift      # <= #1 
command = aliases[command] || command 

case command 
when 'generate', 'destroy', 'plugin', 'benchmarker', 'profiler' 
    require APP_PATH 
    Rails.application.require_environment! # <= #2 
    require "rails/commands/#{command}"  # <= #3 

的興趣點在上面編號。也就是說,在點#1您正在運行的命令正在從ARGV移出。在你的情況下,這意味着generate將從命令行參數中刪除。

在點#2你的環境被加載,在這一點你的初始化將被執行。這裏有一個棘手的部分 - 因爲這時沒有任何指示特定命令的裝載(這發生在#3),沒有信息可以確定發電機正在運行!

讓我們插入腳本到config/initializer/debug.rb,看看什麼是可用的,如果我們跑rails generate model meep

puts $0  #=> "script/rails" 
puts ARGV #=> ["model", "meep"] 

正如你所看到的,沒有直接的信息發電機正在運行。這就是說,有間接的信息。即ARGV[0] #=> "model"。可以想象,您可以創建一個可能的生成器列表,並檢查是否已在ARGV[0]上調用該生成器。我這個負責任的開發人員說這是一種黑客攻擊,並且可能會以你不期待的方式破解,所以我會謹慎使用它。

唯一的其他選擇是修改script/rails像你所建議的 - 這不是一個太糟糕的解決方案,但是當你升級到Rails 4時可能會中斷。


軌道4,你有更多的希望!到application environment is being loaded時,發生器命名空間已經被加載。這意味着在初始化程序中,您可以執行以下操作:

if defined? Rails::Generators #=> "constant" 
    # code to run if generators loaded 
else 
    # code to run if generators not loaded 
end 
相關問題