2012-11-13 10 views
6

chcę wstępnie wypełnić pamięć podręczną z inicjatora, ale nie muszę tego kodu, aby uruchomić za każdym razem biegnę rake lub rails g itp Rake i Bundler są łatwe do czynienia, ale podobne rozwiązanie nie działa dla generatorów:Jak zapobiegać inicjatorów uruchamianie podczas uruchamiania `szyn generate`

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

to musi być bo rails/generators (lub coś podobnego) jest require ed przy starcie. Jak mogę sprawdzić, czy uruchamiana komenda to rails g xyz?

Aktualizacja:

dwa rozwiązania można znaleźć tutaj: Rails 3 initializers that run only on `rails server` and not `rails generate`, etc

Wciąż chcieliby wiedzieć, czy jest to możliwe w sposób próbowałem powyżej.

Odpowiedz

1

W Rails 3, to, co chcesz zrobić, jest możliwe, ale w hacky sposób. Oto jak:

Po dokonaniu rails generate połączenia, CALLPATH wygląda następująco:

ciągu rails/commands kod, który działa dla generowania:

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 

Punkty zainteresowania są ponumerowane powyżej. Mianowicie, że w punkcie #1 uruchomione polecenie przesuwa się z ARGV. Co w twoim przypadku oznacza, że ​​generate zostanie usunięte z argumentów linii poleceń.

W punkcie #2 środowisko zostanie załadowane, w którym to momencie inicjatory zostaną wykonane. I tutaj jest trudna część - ponieważ w tym momencie nie załadowano niczego, co wskazywało na konkretne polecenie (zdarza się to pod #3), nie ma informacji pozwalającej na określenie generatora uruchamianego!

Niech wstawić skrypt do config/initializer/debug.rb aby zobaczyć, co jest dostępne, jeśli wpadliśmy rails generate model meep:

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

Jak widać, nie ma bezpośredniego informacja, że ​​generator jest uruchomiony. To powiedziawszy, istnieją pośrednie informacje. Mianowicie ARGV[0] #=> "model". Niewykluczone, że można utworzyć listę możliwych generatorów i sprawdzić, czy ten generator został wywołany na ARGV[0]. Odpowiedzialny programista twierdzi, że jest to hack i może pękać w sposób, jakiego się nie spodziewałeś, więc użyłbym tego ostrożnie.

Jedyną opcją jest modyfikacja script/rails zgodnie z sugestią użytkownika - co nie jest zbyt dobrym rozwiązaniem, ale najprawdopodobniej zostanie przerwane po uaktualnieniu do Rails 4.


W Szyny 4, masz więcej nadziei! Do czasu application environment is being loaded, przestrzeń nazw generatorów została już załadowana. Oznacza to, że w inicjalizatorze można wykonać następujące czynności:

if defined? Rails::Generators #=> "constant" 
    # code to run if generators loaded 
else 
    # code to run if generators not loaded 
end 
Powiązane problemy