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

时间:2010-12-08 15:29:27

标签: ruby sinatra rack thin rackup

我是红宝石的新手,学习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应用程序传递到服务器(ir:端口)。我尝试将选项合并到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 / the sever?或者问题中的选项应该通过命令行选项直接传递给rackup / thin / the sever?

作为问题的参考,这里是我正在构建的小型Sinatra应用程序:https://github.com/AzizLight/Wiki/

2 个答案:

答案 0 :(得分:11)

您可能会直接或通过配置文件在命令行上将选项传递给精简版。查看所有选项:

$ 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 

答案 1 :(得分:3)

我知道我在这里复活了一个古老的问题,但我遇到了另一个尚未提及的有用解决方案。如this rack wiki tutorial中所述:

  

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

因此,如果您想将主机设置为#\并将端口设置为0.0.0.0,则可以将以下行添加到5656文件的开头:

config.ru