关于Shotgun的Sinatra和Ruby 1.9.2的问题

时间:2010-12-03 15:26:34

标签: ruby ubuntu sinatra

我有一个简单的sinatra应用程序。

require 'rubygems'
require 'sinatra'

get '/' do
  "Hello"
end

当我在Shotgun上运行时,我收到以下错误:

  

引导错误

     

加载时出错了   simple.rb

     

LoadError:没有要加载的文件 -   simple.rb

     

:29:在   require' <internal:lib/rubygems/custom_require>:29:in 需要”   /home/thedinga/.rvm/gems/ruby-1.9.2-p0@global/gems/shotgun-0.8/lib/shotgun/loader.rb:114:in   inner_app' /home/thedinga/.rvm/gems/ruby-1.9.2-p0@global/gems/shotgun-0.8/lib/shotgun/loader.rb:102:in assemble_app”   /home/thedinga/.rvm/gems/ruby-1.9.2-p0@global/gems/shotgun-0.8/lib/shotgun/loader.rb:86:in   proceed_as_child' /home/thedinga/.rvm/gems/ruby-1.9.2-p0@global/gems/shotgun-0.8/lib/shotgun/loader.rb:31:in 呼!”   /home/thedinga/.rvm/gems/ruby-1.9.2-p0@global/gems/shotgun-0.8/lib/shotgun/loader.rb:18:in   call' /home/thedinga/.rvm/gems/ruby-1.9.2-p0@global/gems/shotgun-0.8/lib/shotgun/favicon.rb:12:in 称之为”   /home/thedinga/.rvm/gems/ruby-1.9.2-p0@global/gems/rack-1.2.1/lib/rack/builder.rb:77:in   call' /home/thedinga/.rvm/gems/ruby-1.9.2-p0@global/gems/rack-1.2.1/lib/rack/content_length.rb:13:in称之为”   /home/thedinga/.rvm/gems/ruby-1.9.2-p0@global/gems/rack-1.2.1/lib/rack/handler/webrick.rb:52:in   service' /home/thedinga/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/webrick/httpserver.rb:111:in 服务”   /home/thedinga/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/webrick/httpserver.rb:70:in   {_ 1}}阻止在start_thread'

如果我使用run' /home/thedinga/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/webrick/server.rb:183:in 而不是霰弹枪,我会在浏览器中获得您期望的输出。作为旁注,如果我将它推送到Heroku(我真的想要运行sinatra应用程序),Heroku也将无法运行应用程序。这是1.9.2的版本问题吗?或者我错过了其他什么?

5 个答案:

答案 0 :(得分:8)

上面的代码有效,只需要在config.ru文件中正确要求'#{path} / myapp'来要求“#{path} / myapp”。

在ruby中只有带有“caracter的字符串可以使用内部#{}。在带有'caracter的字符串中,字符串将继续为'#{path} / myapp'而不是'value / of / path / variabel / myapp'。

所以可以像下面这样做

# FILE config.ru

path = File.expand_path "../", __FILE__

require 'rubygems'
require 'sinatra'
require "#{path}/myapp"

run Sinatra::Application


# FILE myapp.rb

get '/' do
  'hello'
end

在app根目录下运行命令shotgun的应用程序

答案 1 :(得分:3)

您是否尝试将配置与应用程序本身解耦?

我的模板类似于

# FILE config.ru

path = File.expand_path "../", __FILE__

require 'rubygems'
require 'sinatra'
require '#{path}/myapp'

run Sinatra::Application


# FILE myapp.rb

get '/' do
  'hello'
end

# FILE start.sh

shotgun -o 0.0.0.0 -p 8888 &

这与ruby1.9.2-p0 ..

答案 2 :(得分:2)

shotgun issues page on github讨论了对此的快速解决方法。

$ shotgun -I. simple.rb

答案 3 :(得分:1)

我的config.ru通常要简单得多:

root = ::File.dirname(__FILE__)
require ::File.join( root, 'app' )

# Assuming your application is subclassed from Sinatra::Application
run MyApp.new 

app.rb文件可以(并且应该)需要Sinatra(如果你没有使用1.9,则需要rubygems)。

答案 4 :(得分:0)

我正在使用Ruby 1.9.2和Sinatra,我在使用Shotgun时也遇到了问题。有一个简单的解决方法:使用sinatra-repeater gem而不是Shotgun。 Sinatra Book中描述了安装和设置:http://sinatra-book.gittr.com/#automatic_code_reloading