【问题标题】:How do I make my rack app a gem?如何使我的机架应用程序成为宝石?
【发布时间】:2013-07-20 11:11:12
【问题描述】:

我有一个不错的 .ru 文件,可以使用 rackup 运行,但我希望能够将其作为 gem 发布。我假设我可以将其移动到 lib 目录并将其添加到我的 gemspec 但我还需要做什么才能在安装 gem 后运行它?

【问题讨论】:

    标签: ruby gem rack


    【解决方案1】:

    Gemspec+正确的目录结构+(最重要的是)将启动您的应用程序的脚本(可能带有run)放入bin/ 目录中。

    更多关于 gem 二进制文件的细节here

    更新

    根据要求提供示例。我制作了一个名为agent 的宝石,它依赖于sinatra(它也依赖于rack)。它有这个Agent::Server的定义:

    module Agent
      # Your code goes here...
      class Server <  ::Sinatra::Base
    
        get '/sync' do
            [200, "yahoo!"]
        end
      end
    

    我还创建了名为test 的文件,其内容如下:

    #!/usr/bin/env ruby
    
    require "rubygems"
    require "agent"
    
    Rack::Handler::WEBrick.run(
      Agent::Server.new,
      :Port => 9000
    )
    

    然后,如果我在此之后运行chmod 0755 test./test,我可以转到http://localhost:900/sync 并查看yahoo!

    【讨论】:

    • 你知道如何编写一个.rb 来启动一个.ru 机架应用程序吗?我想这就是我真正追求的。
    • 我假设您必须处理 .ru 文件或将其转换为我在更新我的答案时建议的形式。毕竟,您的 Rack 应用程序很可能是一个可以运行的类。 Rackup 命令的作用与我为test 文件提供的代码几乎相同,具有一些简洁的功能,例如处理参数和在内核范围内提供run 方法。
    【解决方案2】:

    这就是我最终得到的结果:

    #!/usr/bin/env ruby
    
    require 'rack'
    require 'illusionist'
    
    options = {
      :Host => '127.0.0.1',
      :Port => '8080'
    }
    
    merlin = Illusionist.new
    
    Rack::Handler::Thin.run(merlin, options) do |server|
      [:INT, :TERM].each { |sig| trap(sig) { server.stop } }
    end
    

    我将 .ru 文件重命名为 .rb,然后使用上述代码启动它。感谢@Anton 让我开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多