我正在深入研究Gitlab的Web应用程序的工作方式,首先从查看它使用的Web服务器(Unicorn)开始。 config.ru
file如下所示:
if defined?(Unicorn)
require 'unicorn'
if ENV['RAILS_ENV'] == 'production' || ENV['RAILS_ENV'] == 'staging'
# Unicorn self-process killer
require 'unicorn/worker_killer'
min = (ENV['GITLAB_UNICORN_MEMORY_MIN'] || 400 * 1 << 20).to_i
max = (ENV['GITLAB_UNICORN_MEMORY_MAX'] || 650 * 1 << 20).to_i
# Max memory size (RSS) per worker
use Unicorn::WorkerKiller::Oom, min, max
end
end
我的问题是,如果已经定义了Unicorn常量,这是否意味着随后的require
语句是多余的?如果将if
更改为unless
,我可以看到这种逻辑是有意义的,但是否则我肯定会丢失一些东西。
我检查了该文件的先前提交,在进行此更改之前,该文件如下所示:
# This file is used by Rack-based servers to start the application.
unless defined?(PhusionPassenger)
# Unicorn self-process killer
require 'unicorn/worker_killer'
# Max memory size (RSS) per worker
use Unicorn::WorkerKiller::Oom, (200 * (1 << 20)), (250 * (1 << 20))
end
require ::File.expand_path('../config/environment', __FILE__)
map ENV['RAILS_RELATIVE_URL_ROOT'] || "/" do
run Gitlab::Application
end
从引入if defined?(Unicorn)
和require
语句的提交中,我了解到if
检查是作为unless defined?(PhusionPassenger)
的替换而引入的,因为还有许多其他除了独角兽公司外,还有机架式网络服务器。但这并不能弄清楚为什么引入了随后的require
语句。