Как определить, выполняется ли Rails из CLI, консоли или сервера? - программирование
Подтвердить что ты не робот

Как определить, выполняется ли Rails из CLI, консоли или сервера?

У меня есть промежуточное программное обеспечение для объявления моего приложения в локальном сетевом приложении с использованием Bonjour, но оно также объявляет услугу, когда Rails вызывается с rake или через консоль.

Я хотел бы исключить эти случаи и использовать только промежуточное ПО Bonjour, когда Rails работает как сервер.

Конфигурация промежуточного программного обеспечения принимает proc для исключения посредников при определенных условиях с помощью proc:

config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| 
  env['HTTPS'] != 'on' 
}

Но как определить, был ли Rails запущен из консоли, консоли или в качестве сервера?

4b9b3361

Ответ 1

Peeking в модуле Rails с помощью pry показывает, что консольные вызовы можно обнаружить следующим образом:

Rails.const_defined? 'Console'

И вызовы сервера вроде этого:

Rails.const_defined? 'Server'

Ответ 2

Супер полезно. Спасибо @crishoj.

Я хотел более внимательно изучить объект Консоли для другой проблемы, над которой я работаю, и выяснил, что константу Консоли можно достичь с помощью Rails::Console, поэтому другой вариант проверки должен был бы использовать:

defined? Rails::Console
defined? Rails::Server

Ответ 3

"Сервер" не определен, когда Rails 5 работает под Пассажиром.

Лучшее решение, которое я нашел, - это вариант ответа this:

if %w(rails rake).include?(File.basename($0))
   <console or runner>
else
   <server>       
end

Ответ 4

Используя Rails 5 с или без приложения-сервера, такого как Puma/Passenger, можно найти три способа определить, как работает ваше приложение:

# We are running in a CLI console
defined?(Rails::Console)

# We are running as a Rack application (including Rails)
caller.any?{|l| l =~ %r{/config.ru/}}

# We are running as a CLI console
caller.any?{|l| l =~ %r{/lib/rake/task.rb:\d+:in 'execute'}}

Ответ 5

Для Падрино:

Проверка консоли:

if Padrino::constants.include? :Cli #your code end

Проверка сервера:

if !Padrino::constants.include? :Cli #your code end

Ответ 6

В нашем проекте мне пришлось обнаруживать консольный режим в boot.rb, потому что я использовал:

in_console = (ARGV & ['c', 'console']).any?

Не безупречное решение, но достаточно хорошее для нашего прецедента.