无法加载此类文件 - rack/handler/puma

Sir*_*ame 7 ruby sinatra rackup puma

我的设置和错误

当我用机架和美洲狮开始我的Sinatra应用程序时出错.我的config.ru文件看起来像这样:

#\ -s puma
require './controller/main.rb'
run Sinatra::Application
Run Code Online (Sandbox Code Playgroud)

因此,当我现在使用rackup时,我收到此错误:

/home/username/.rvm/gems/ruby-1.9.3-p392/gems/rack-1.5.2/lib/rack/handler.rb:76:in"require":无法加载此类文件 - 机架/处理程序/ puma(LoadError)

我用ruby 1.9.3p392(2013-02-22修订版39386)[i686-linux]

到目前为止我尝试过的

我的第一个想法是我忘了安装美洲狮,或者美洲狮在某种程度上被打破了.所以我尝试过:

puma -v
puma version 2.0.1
Run Code Online (Sandbox Code Playgroud)

我直接用ruby开始它:

ruby controller/main.rb 
Puma 2.0.1 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:4567
Run Code Online (Sandbox Code Playgroud)

我发现了这个美洲狮问题,但我找不到真正的解决方案.

最后我的问题

  1. 为什么要发生这种情况?

  2. 我怎样才能解决这个问题?

iai*_*ain 7

  1. 对宝石进行沙盒处理,以免它们与Rubygems安装的宝石混在一起.

    删除当前的捆绑包

    rm -rf .bundle Gemfile.lock bin vendor
    
    Run Code Online (Sandbox Code Playgroud)

    然后跑

    bundle install --binstubs --path vendor
    
    Run Code Online (Sandbox Code Playgroud)

    这会将所有gem安装vendor/RUBY-ENGINE/VERSION/bindir中,并将所有可执行文件安装到dir中.它们与通过gem命令安装的分开,这将是系统范围的.

  2. 运行使用bundle exec,但由于使用了--binstubs命令,您可以改为运行

    bin/rackup config.ru
    
    Run Code Online (Sandbox Code Playgroud)

通过使用bundle exec或者bin/您告诉Bundler的其中一个可执行文件仅使用安装的gem .如果您使用Bundler安装Puma,那么它将安装Bundler安装的Rack的Puma处理程序.但是,你可能会有Rubygems(via gem install rack -r)安装的另一个版本的Rack 没有处理程序.要获得正确的沙箱,请对项目的宝石进行沙箱处理,并始终从bin/目录中运行.如果您需要该ruby命令,则使用bundle exec ruby…和Bundler将为项目加载正确的gem.

我现在每个项目都这样做,只有gem install…在系统范围内需要它时才安装宝石.它还确保你不会错过Gemfile中的任何宝石,因为你的系统上已有它们 - 部署时没有令人讨厌的惊喜!