【发布时间】:2013-07-20 11:11:12
【问题描述】:
我有一个不错的 .ru 文件,可以使用 rackup 运行,但我希望能够将其作为 gem 发布。我假设我可以将其移动到 lib 目录并将其添加到我的 gemspec 但我还需要做什么才能在安装 gem 后运行它?
【问题讨论】:
我有一个不错的 .ru 文件,可以使用 rackup 运行,但我希望能够将其作为 gem 发布。我假设我可以将其移动到 lib 目录并将其添加到我的 gemspec 但我还需要做什么才能在安装 gem 后运行它?
【问题讨论】:
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 方法。
这就是我最终得到的结果:
#!/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 让我开始。
【讨论】: