Определить, было ли приложение запущено как HTTP-сервер или нет (rake task, rconsole и т. д)
Я использую EventMachine и монетарно для запуска сервера E TCP вместе с моим приложением rails. Это начинается с config/initializers/momentarily.rb
.
Моя проблема в том, что он запускается также, когда я выполняю задачи rake, такие как db:migrate
. Я только хочу, чтобы он начинался, когда я запускаю HTTP-сервер. Среды не помогут, так как и задачи запуска сервера, и задачи rake находятся в среде разработки. Есть ли способ узнать, что приложение работает на HTTP-сервере в отличие от всего остального? Обратите внимание, что это не только грабли задач, ЭМ запускается также, если я запускаю консоль rails, что опять-таки что-то не желательное для моего случая.
6 ответов:
Насколько я знаю, нет лучшего способа сделать это. Вы можете скопировать подходnewrelic (Проверьте
discover_dispatcher
в local_environment.rb ), который в основном имеет список эвристик, используемых для обнаружения, работает ли он внутри пассажира, тонкого и т. д.Для пассажира он проверяет
defined?(::PhusionPassenger)
Для тонких он проверяет
if defined?(::Thin) && defined?(::Thin::Server)
unless File.basename($0) == "rake" && ARGV.include?("db:migrate") # you are not in rake db:migrate end
Задайте переменную окружения в файле
config.ru
и используйте ее в любом месте кода, чтобы определить, выполняется ли она только с помощью командыrails server
.Например
файл:
config.ru
ENV['server_mode'] = '1'
И использовать его где-то как:
файл:
config/environment.rb
Thread.new { infinite_loop! }.join if ENV['server_mode'] = '1'
Ссылка: Ответ
Может быть, вы можете реализовать переключатель в инициализаторе на основе
ARGV
?Что-то вроде:
if ARGV.join(' ').match /something/ # your initializer code here end