Ruby on rails 如何确定Rails是从CLI、控制台还是作为服务器运行?

Ruby on rails 如何确定Rails是从CLI、控制台还是作为服务器运行?,ruby-on-rails,rack,rack-middleware,Ruby On Rails,Rack,Rack Middleware,我有一个服务,但它也宣布了当Rails从rake或通过控制台调用时的服务 我想排除这些情况,只在Rails作为服务器运行时使用Bonjour中间件 中间件配置接受一个proc,在特定条件下使用proc排除中间件: config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' } 但是如何确定Rails是从CLI、控制台

我有一个服务,但它也宣布了当Rails从rake或通过控制台调用时的服务

我想排除这些情况,只在Rails作为服务器运行时使用Bonjour中间件

中间件配置接受一个proc,在特定条件下使用
proc
排除中间件:

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

但是如何确定Rails是从CLI、控制台还是作为服务器调用的?

使用查看
Rails
模块可以发现控制台调用如下:

Rails.const_defined? 'Console'
Rails.const_defined? 'Server'
和服务器调用,如下所示:

Rails.const_defined? 'Console'
Rails.const_defined? 'Server'

非常有用。谢谢你

我想更仔细地检查Console对象以了解我正在处理的另一个问题,并发现可以使用
Rails::Console
访问Console常量,因此另一个检查选项是使用:

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

当Rails 5在乘客模式下运行时,未定义“服务器”

我找到的最佳解决方案是答案的变体:

if%w(rails rake).include?(File.basename($0))
其他的
结束

使用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?
不是傻瓜式的解决方案,但对于我们的用例来说已经足够好了。

每个命令的环境摘要。 我发现现有的答案要么不完整,要么多余,要么不够详尽。下面是每个命令的表格格式以及生成的环境

轨道4.2 您可以看到,仅检查定义为
Rails
常量的“Server”不会捕获生成器,就像
railsgmigration
一样。为此,您需要检查
ARGV


我希望这有帮助。我只能立即访问Rails 4.2,但可以随意添加其他Rails版本的部分,以及添加任何需要“捕获”的附加命令。

有趣的是,这只在调用命令“Rails s”或“Rails c”时起作用。如果您通过不同的命令(例如,“unicorn_rails”)运行服务器,则永远不会定义这些常量。Rails::Server看起来像是被定义为命令解析过程的一部分,尽管它继承自::Rack::Server。这对我来说不适用于Rails 4,即使是Rails c。我正在控制台中定义服务器和控制台。@MarkTabler@DanHerman如果使用unicorn启动Rails,可以试试这个吗<代码>(Rails.const_defined?'Server')|($0.include?'unicorn')
Rails::Server
仍然是在生成器脚本中定义的,比如
Rails g migration
Server
在使用passengertanks向我介绍
ARGV
时没有定义。这是检测何时调用了
rails g
的唯一方法,而不是
rails s
rails::Server
仍在生成器脚本中定义,如
rails g migration
。另外,
Rails::Console
是在运行
Rails s s
时定义的
Rails::Server
仍然是在生成器脚本(如
Rails g migration
中定义的。另外,
Rails::Console
是在运行
Rails s
调用者时定义的。是否应该删除尾部斜杠?固定线路是:
caller.any?{| l | l=~%r”/config\.ru}
稍微干净一点的版本:
caller.grep(%r{/config.ru})。有吗?