【问题标题】:Passing options to rackup via a Sinatra application通过 Sinatra 应用程序将选项传递给 rackup
【发布时间】:2011-05-22 07:27:11
【问题描述】:

我是 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 应用程序传递到服务器(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/服务器?或者问题中的选项应该通过命令行选项直接传递给 rackup/thin/the 服务器?

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

【问题讨论】:

    标签: ruby sinatra rack thin rackup


    【解决方案1】:

    您实际上将在命令行上直接或通过配置文件将选项传递给瘦身。查看所有选项:

    $ 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 
    

    【讨论】:

      【解决方案2】:

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

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

      因此,如果您想将主机设置为0.0.0.0 并将端口设置为5656,您可以在config.ru 文件的开头添加以下行:

      #\ -o 0.0.0.0 -p 5656
      

      【讨论】:

      • 完美运行。但是有没有办法从代码中设置值?例如 :port => RACK_ENV=="production" ? 8080 : 3000
      • 也许在 'if else' 中包含 '#\' 注释设置行?虽然不确定
      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      相关资源
      最近更新 更多