我有一个简单的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:ininner_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:inproceed_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:incall' /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:incall' /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:inservice' /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的版本问题吗?或者我错过了其他什么?
答案 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