Ответ 1
Peeking в модуле Rails
с помощью pry показывает, что консольные вызовы можно обнаружить следующим образом:
Rails.const_defined? 'Console'
И вызовы сервера вроде этого:
Rails.const_defined? 'Server'
У меня есть промежуточное программное обеспечение для объявления моего приложения в локальном сетевом приложении с использованием Bonjour, но оно также объявляет услугу, когда Rails вызывается с rake или через консоль.
Я хотел бы исключить эти случаи и использовать только промежуточное ПО Bonjour, когда Rails работает как сервер.
Конфигурация промежуточного программного обеспечения принимает proc для исключения посредников при определенных условиях с помощью proc
:
config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env|
env['HTTPS'] != 'on'
}
Но как определить, был ли Rails запущен из консоли, консоли или в качестве сервера?
Peeking в модуле Rails
с помощью pry показывает, что консольные вызовы можно обнаружить следующим образом:
Rails.const_defined? 'Console'
И вызовы сервера вроде этого:
Rails.const_defined? 'Server'
Супер полезно. Спасибо @crishoj.
Я хотел более внимательно изучить объект Консоли для другой проблемы, над которой я работаю, и выяснил, что константу Консоли можно достичь с помощью Rails::Console
, поэтому другой вариант проверки должен был бы использовать:
defined? Rails::Console
defined? Rails::Server
"Сервер" не определен, когда Rails 5 работает под Пассажиром.
Лучшее решение, которое я нашел, - это вариант ответа this:
if %w(rails rake).include?(File.basename($0))
<console or runner>
else
<server>
end
Используя 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'}}
Для Падрино:
Проверка консоли:
if Padrino::constants.include? :Cli #your code end
Проверка сервера:
if !Padrino::constants.include? :Cli #your code end
В нашем проекте мне пришлось обнаруживать консольный режим в boot.rb, потому что я использовал:
in_console = (ARGV & ['c', 'console']).any?
Не безупречное решение, но достаточно хорошее для нашего прецедента.