2011-12-28 32 views
9

Tôi có một đoạn mã khởi tạo tương đối nhỏ mà tôi muốn chạy bất cứ khi nào rails server chạy, nhưng không phải khi tôi chạy rails generate, rails console hoặc bất kỳ lệnh rails khác (bao gồm các nhiệm vụ cào yêu cầu tác vụ môi trường). Đoạn mã này trước lấp đầy một số bộ nhớ đệm và là tương đối đắt tiền vì vậy tôi thực sự không muốn nó chạy trên bất cứ điều gì nhưng rails sRails 3 initializers chỉ chạy trên `rails server` chứ không phải` rails generate`, vv

Giải pháp mà không đạt yêu cầu:

Foreman et al. sẽ có nghĩa là nó sẽ chạy trên một tiến trình khác (a) trên đầu trang cho đoạn mã nhỏ đó, (b) yêu cầu truyền thông interprocess thay vì cách tiếp cận đơn giản trong bộ nhớ được tạo bởi bộ khởi tạo.

Trên máy chủ tôi đã giải quyết vấn đề này bằng cách định cấu hình hành khách chuyển một biến môi trường đặc biệt thành đường ray, cho biết nó đang chạy trong ngữ cảnh máy chủ. Tuy nhiên tôi muốn nó nếu có thể làm việc ra khỏi hộp trên tất cả các máy của nhà phát triển mà không cần nhớ để chạy máy chủ đường ray theo cách cũng sẽ cung cấp biến môi trường đó (ví dụ: IN_SERVER=true rails server).

Câu hỏi này luôn được hỏi trước khi chạy trình khởi tạo khi chạy trong rails server và không ở số rake. Tuy nhiên tôi muốn nó chạy đặc biệt chỉ trong khởi tạo máy chủ - sửa chữa cho rake là tuyệt vời nhưng không phải là toàn diện.

Trả lời

4

Bạn có thể làm điều gì đó như ghi đè Rails::Server#initialize để nó gọi mã khởi tạo của bạn trong trình khởi tạo không?

Hoặc, dễ dàng hơn, chỉ cần đặt mã của bạn trong script/rails, vì điều đó sẽ được chạy mỗi khi bạn chạy rails server, bạn có thể dễ dàng fiddle với ARGV hoặc ENV trong đó.

+0

Tôi thích nó rất nhiều, vì vậy cái gì đó như '$ IN_SERVER = true nếu argv [0] == 'server'' trong kịch bản/đường ray là một giải pháp tuyệt vời. –

+1

Tôi không chắc chắn rằng hành khách khởi động Rails với 'script/rails'. Có ai thực sự có phương pháp này để làm việc với hành khách không? – jordanpg

0

Dưới đây là một cách:

# config/initializers/my_init.rb 
Rails.application.config.after_initialize do 
    # tweak this as required... 
    unless defined?(::Rails::Generators) || defined?(::Rails::Console) || File.basename($0) =='rake' 
     Rails.logger.info("Doing some init") 
     # ... 
    end 
end