【发布时间】:2011-06-28 19:58:37
【问题描述】:
我有一个小型 Sinatra 应用程序,它正在调用我开发的名为 Jido 的库。这个库由一个 RubyGem 提供,我在 Sinatra 应用程序的 Gemfile 中将其列为依赖项。我可以在运行 Ruby 1.9.2 的本地计算机上运行此应用程序而不会遇到任何错误。但是,当我推送到 Heroku 并访问使用此“Jido”库的页面时,服务器返回错误。从日志中我看到 Heroku 服务器正在运行 Ruby 1.8.7。这是 Heroku 错误日志中的堆栈跟踪:
2011-02-16T18:42:29-08:00 app[web.1]: NameError - uninitialized constant Jido:
2011-02-16T18:42:29-08:00 app[web.1]: ./jido.rb:23:in `GET /conjugate/:lang/:verb'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:1057:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:1057:in `compile!'
2011-02-16T18:42:29-08:00 heroku[router]: GET jido.heroku.com/conjugate/en/be dyno=web.1 queue=0 wait=1029ms service=5ms bytes=228
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:643:in `instance_eval'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:643:in `route_eval'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:627:in `route!'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:675:in `process_route'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:672:in `catch'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:672:in `process_route'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:626:in `route!'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:625:in `each'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:625:in `route!'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:760:in `dispatch!'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:553:in `call!'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:725:in `instance_eval'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:725:in `invoke'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:725:in `catch'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:725:in `invoke'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:553:in `call!'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:538:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/rack-1.2.1/lib/rack/methodoverride.rb:24:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/rack-1.2.1/lib/rack/commonlogger.rb:18:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:1167:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:1193:in `synchronize'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/sinatra-1.1.2/lib/sinatra/base.rb:1167:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /home/heroku_rack/lib/static_assets.rb:9:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /home/heroku_rack/lib/last_access.rb:15:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/rack-1.2.1/lib/rack/urlmap.rb:47:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/rack-1.2.1/lib/rack/urlmap.rb:41:in `each'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/rack-1.2.1/lib/rack/urlmap.rb:41:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /home/heroku_rack/lib/date_header.rb:14:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /app/9d9320fd-f5b9-4dca-a96e-0bdee91997b0/home/.bundle/gems/ruby/1.8/gems/rack-1.2.1/lib/rack/builder.rb:77:in `call'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/lib/thin/connection.rb:76:in `pre_process'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/lib/thin/connection.rb:74:in `catch'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/lib/thin/connection.rb:74:in `pre_process'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/lib/thin/connection.rb:57:in `process'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/lib/thin/connection.rb:42:in `receive_data'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/lib/thin/backends/base.rb:57:in `start'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/lib/thin/server.rb:156:in `start'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/lib/thin/controllers/controller.rb:80:in `start'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/lib/thin/runner.rb:143:in `run!'
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/thin-1.2.6/bin/thin:6
2011-02-16T18:42:29-08:00 app[web.1]: /usr/ruby1.8.7/bin/thin:19:in `load'
在我的主要 Sinatra 脚本中与此错误相关的行:
require 'rubygems'
require 'sinatra'
require 'json'
require 'jido'
conjugators = {}
get '/conjugate/:lang/:verb' do
content_type :json
conjugator = nil
if conjugators[params[:lang]].nil?
conjugator = Jido.load params[:lang] # exception "Uninitialized constant Jido" is thrown here
conjugators[params[:lang]] = conjugator
else conjugator = conjugators[params[:lang]] end
conjugator.conjugate(params[:verb]).to_json
end
正如我所说,这段代码在我的 Ruby 1.9.2 机器上运行良好。我已经测试过从 Sinatra 应用程序和 IRB 调用这个 Jido 模块——两者都运行没有问题。当我推送到 Heroku 时,我看到 jido gem 已按照我的 Gemfile 的要求安装,但由于某种原因,我无法在我的 Sinatra 脚本中引用它。有什么想法吗?
Sinatra 应用程序的完整源代码(包括 Gemfile 和 Gemfile.lock)可在 https://github.com/hans/jido-site 获得。
【问题讨论】:
-
您是否已经意识到这一点? devcenter.heroku.com/articles/stack 例如:'heroku stack:migrate 竹-mri-1.9.2'
标签: ruby heroku sinatra require