ruby-on-rails - sirve - ruby on rails tutorial
¿Cómo determinar si Rails se está ejecutando desde CLI, consola o como servidor? (6)
''Servidor'' no está definido cuando Rails 5 se ejecuta bajo Pasajero.
La mejor solución que he encontrado es una variante de this respuesta:
if %w(rails rake).include?(File.basename($0))
<console or runner>
else
<server>
end
Tengo un middleware para anunciar mi aplicación en la aplicación de red local que utiliza Bonjour , pero también anuncia el servicio cuando se invoca Rails desde rastrillo oa través de la consola.
Me gustaría excluir estos casos, y solo usar el middleware Bonjour cuando Rails se ejecuta como un servidor.
La configuración de middleware acepta un proc para excluir middlewares bajo ciertas condiciones usando un proc
:
config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env|
env[''HTTPS''] != ''on''
}
Pero, ¿cómo puedo determinar si Rails fue invocado desde la CLI, la consola o como un servidor?
Echar un vistazo al módulo Rails
mediante el uso de pry revela que las invocaciones de la consola se pueden detectar así:
Rails.const_defined? ''Console''
Y invocaciones de servidor como esta:
Rails.const_defined? ''Server''
En nuestro proyecto tuve que detectar el modo de consola en boot.rb , para eso utilicé:
in_console = (ARGV & [''c'', ''console'']).any?
No es una solución infalible, pero lo suficientemente buena para nuestro caso de uso.
Para Padrino:
Comprobación de la consola:
if Padrino::constants.include? :Cli #your code end
Verificación del servidor:
if !Padrino::constants.include? :Cli #your code end
Super servicial Gracias @crishoj.
Quería examinar el objeto de la Consola más de cerca por otro problema en el que estoy trabajando y descubrí que la constante de la Consola se puede alcanzar con Rails::Console
, por lo que otra opción para verificar sería usar:
defined? Rails::Console
defined? Rails::Server
Usando Rails 5 con o sin un servidor de aplicaciones como Puma / Passenger, aquí hay tres maneras de determinar cómo se ejecuta su aplicación:
# 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''}}