tl;dr我怎样才能让一个 Sinatra 应用程序通过自定义在不同的服务器上以非常不同的方式启动config.ru
?
背景
我有一个使用 Sinatra 编写的 Web 应用程序,它在不同的服务器上运行。目前,这些服务器的代码库是分叉的,因为它们的工作方式(离散)部分存在一些重大差异。例如:
- 一台服务器通过 Intranet LDAP 服务器对用户进行身份验证,而另一台服务器使用更简单的本地数据库表查找。
- 一台服务器使用外部 cron 作业定期更新一些统计信息,而另一台(基于 Windows 的)服务器使用内部休眠线程。
- 一台服务器将某些元数据存储在本地表中,而另一台服务器通过屏幕抓取 (!) 从外部 Wiki 提取元数据。
…等等。
我想让这些代码库完全共享(单个 Git 存储库)。我设想每台服务器都会有一个稍微不同的配置文件,这会导致应用程序以不同的方式启动。
废弃的解决方案
我可以根据环境变量更改应用程序的行为。由于行为的变化并不多,我宁愿不隐藏环境变量中的设置。
我可以创建自己的“server-settings.rb”文件,该文件对每台机器都是唯一的,在我app.rb
的 . 然而,这似乎是在重新发明轮子。我已经为config.ru
每个服务器命名了一个文件。我不应该用这个吗?
当前代码
我config.ru
目前的应用程序很简单:
require ::File.join( ::File.dirname(__FILE__), 'app' )
run MyApp.new
app.rb
它需要的本质上是:
require 'sinatra'
require_relative 'helpers/login' # customized for LDAP lookup on this server
class MyApp < Sinatra::Application
use Rack::Session::Cookie, key:'foo.bar', path:'/', secret:'ohnoes'
set :protection, except: [:path_traversal, :session_hijacking]
configure :production do
# run various code that depends on server settings, e.g.
Snapshotter.start # there is no cron on this machine, so we do it ourselves
end
configure :development do
# run various code that depends on server settings
end
end
问题
我想不config.ru
辜负它的名字,让它看起来像这样:
require ::File.join( ::File.dirname(__FILE__), 'app' )
run MyApp.new( auth: :ldap, snapshot:false, metadata: :remote_wiki, … )
如何根据通过提供的设置修改我的应用程序以更改其配置行为config.ru
?或者这是对 的滥用config.ru
,试图将其用于完全错误的事情?