通过Sinatra应用程序向rackup传递选项

13
我是ruby的新手,正在学习Sinatra。通过需要'sinatra'并直接设置路由来创建Sinatra站点非常容易且文档相当详细,但是通过需要'sinatra/base'并编写从'Sinatra::Base'继承的类来创建应用程序则相对容易但文档非常差(也许因为这是Sinatra的一个相当新的功能)。
这正是我正在做的。在Sinatra方面我没有太多麻烦,但是在rackup/thin/server方面有一些困难。显然有两种方式部署应用程序:使用Sinatra本身(使用run!方法)和使用rackup文件(通常是config.ru)。
使用Sinatra的run!方法非常直观且效果很好,但显然如果我想在heroku上部署我的应用程序,则无法使用此方法。实际上,几乎我在GitHub上遇到的所有Sinatra应用程序都使用config.ru文件。
使用rackup文件可能同样直观,但我无法理解如何将选项从Sinatra应用程序传递给服务器(例如端口)。我尝试将选项合并到rackup的默认选项数组中:
MyApp::App.default_options.merge!(
  :run  => false,
  :env  => :production,
  :port => 4567
)

run MyApp::App

通过直接向应用程序添加选项:

MyApp::App.set :port, 4567
MyApp::App.set :run, false
MyApp::App.set :env, :production

run MyApp::App

通过在应用程序类中设置选项:

module MyApp
  class App < Sinatra::Base
    set :port, 4567
    set :run, false
    set :env, :production

    # ...

  # config.ru
  require 'app'

  run MyApp::App
所有上述方法均失败,无论是显示错误消息还是根本不考虑任何选项。那么,在使用rackup文件时,是否有办法通过Sinatra应用程序向rackup/thin/服务器传递选项?或者问题中的选项应该直接通过命令行选项传递给rackup/thin/服务器?作为问题的参考,这里是我正在构建的一个小的Sinatra应用程序:https://github.com/AzizLight/Wiki/
2个回答

11

实际上,您将直接通过命令行或配置文件向thin传递选项。查看所有选项:

$ thin -h

生产环境中,请使用配置文件:

$ thin -C thin-production.yml -R config.ru start

以下是一个thin-production.yml文件的示例:

---
address: localhost
port: 3020
servers: 4
max_conns: 1024
max_persistent_conns: 512
timeout: 30
environment: production
pid: tmp/pids/thin-production.pid
log: log/thin-production.log
daemonize: true 

3

我知道我在这里提出了一个古老的问题,但我发现还没有提到另一个有用的解决方案。正如在这个rack wiki教程中所述:

#\ 开头的第一行被视为选项,允许在配置文件中指定 rackup 参数。

因此,如果你想将主机设置为 0.0.0.0,端口设置为 5656,则需要将以下行添加到您的 config.ru 文件开头:

#\ -o 0.0.0.0 -p 5656

工作得很好。但是有没有办法从代码中设置值?例如:port => RACK_ENV=="production" ? 8080 : 3000 - 18augst
也许可以将'#'注释设置行放在'if else'中?不过不太确定。 - Gus Shortz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接