2012-11-13 37 views
6

Tôi muốn cài đặt sẵn bộ đệm của mình bằng bộ khởi tạo, nhưng tôi không cần mã này để chạy mỗi lần chạy rake hoặc rails g, v.v. Rake và Bundler thật dễ dàng để đối phó với, nhưng là một giải pháp tương tự không làm việc cho các máy phát điện:Cách ngăn khởi chạy khi chạy `đường ray tạo ra '

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

này phải là do rails/generators (hoặc một cái gì đó tương tự) là require ed khi chạy. Làm cách nào để kiểm tra xem liệu lệnh có đang chạy là rails g xyz?

Cập nhật:

Hai giải pháp có thể được tìm thấy ở đây: Rails 3 initializers that run only on `rails server` and not `rails generate`, etc

Tuy nhiên muốn biết nếu nó có thể theo cách tôi đã cố gắng ở trên.

Trả lời

1

Trong Rails 3, những gì bạn đang muốn làm là có thể tưởng tượng được, nhưng theo một cách hacky. Đây là cách:

Khi bạn thực hiện cuộc gọi rails generate, các callpath trông như thế này:

Trong rails/commands mã mà chạy cho generate:

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 

Các điểm đáng chú ý được đánh số trên. Cụ thể, tại điểm #1 lệnh bạn đang chạy đang dịch chuyển khỏi số ARGV. Trong trường hợp của bạn có nghĩa là generate sẽ bị xóa khỏi dòng lệnh args.

Tại điểm #2 môi trường của bạn được tải, tại thời điểm khởi tạo của bạn sẽ được thực hiện. Và đây là một phần khó khăn - bởi vì không có gì chỉ ra một lệnh cụ thể đã được tải vào thời điểm này (điều này xảy ra tại #3) không có thông tin để xác định một máy phát điện đang được chạy!

Hãy chèn một đoạn script vào config/initializer/debug.rb để xem những gì có sẵn nếu chúng tôi chạy rails generate model meep:

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

Như bạn có thể thấy, không có thông tin trực tiếp mà một máy phát điện đang được chạy. Điều đó nói rằng, có thông tin gián tiếp. Cụ thể là ARGV[0] #=> "model". Conceivably bạn có thể tạo ra một danh sách các máy phát điện có thể và kiểm tra xem máy phát điện đó đã được gọi trên ARGV[0]. Các nhà phát triển có trách nhiệm trong tôi nói rằng đây là một hack và có thể phá vỡ theo cách bạn không mong đợi vì vậy tôi sẽ sử dụng điều này một cách thận trọng.

Tùy chọn duy nhất khác là sửa đổi script/rails như bạn đã đề xuất - đây không phải là giải pháp quá tệ, nhưng có khả năng sẽ xảy ra khi bạn nâng cấp lên Rails 4.


Trong Rails 4, bạn đã có hy vọng nhiều hơn nữa! Vào thời điểm application environment is being loaded, không gian tên máy phát điện đã được tải. Điều này có nghĩa là trong trình khởi tạo, bạn có thể thực hiện các thao tác sau:

if defined? Rails::Generators #=> "constant" 
    # code to run if generators loaded 
else 
    # code to run if generators not loaded 
end 
Các vấn đề liên quan