cannot load such file — readline (LoadError) when

2020-02-08 03:35发布

问题:

I'm trying to deploy my Rails application to Heroku to test it out by following these instructions:

http://devcenter.heroku.com/articles/rails3#prerequisites

Here is the command I'm trying to run:

heroku create --stack cedar

And I get this error message:

/home/sergio/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- readline (LoadError)
    from /home/sergio/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/sergio/.rvm/gems/ruby-1.9.3-p125/gems/heroku-2.20.1/lib/heroku/command/run.rb:1:in `<top (required)>'
    from /home/sergio/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/sergio/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/sergio/.rvm/gems/ruby-1.9.3-p125/gems/heroku-2.20.1/lib/heroku/command.rb:14:in `block in load'
    from /home/sergio/.rvm/gems/ruby-1.9.3-p125/gems/heroku-2.20.1/lib/heroku/command.rb:13:in `each'
    from /home/sergio/.rvm/gems/ruby-1.9.3-p125/gems/heroku-2.20.1/lib/heroku/command.rb:13:in `load'
    from /home/sergio/.rvm/gems/ruby-1.9.3-p125/gems/heroku-2.20.1/lib/heroku/cli.rb:8:in `start'
    from /home/sergio/.rvm/gems/ruby-1.9.3-p125/gems/heroku-2.20.1/bin/heroku:15:in `<top (required)>'
    from /home/sergio/.rvm/gems/ruby-1.9.3-p125/bin/heroku:19:in `load'
    from /home/sergio/.rvm/gems/ruby-1.9.3-p125/bin/heroku:19:in `<main>'

And this is the content of the file in question:

#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

module Kernel

  if defined?(gem_original_require) then
    # Ruby ships with a custom_require, override its require
    remove_method :require
  else
    ##
    # The Kernel#require from before RubyGems was loaded.

    alias gem_original_require require
    private :gem_original_require
  end

  ##
  # When RubyGems is required, Kernel#require is replaced with our own which
  # is capable of loading gems on demand.
  #
  # When you call <tt>require 'x'</tt>, this is what happens:
  # * If the file can be loaded from the existing Ruby loadpath, it
  #   is.
  # * Otherwise, installed gems are searched for a file that matches.
  #   If it's found in gem 'y', that gem is activated (added to the
  #   loadpath).
  #
  # The normal <tt>require</tt> functionality of returning false if
  # that file has already been loaded is preserved.

  def require path
    if Gem.unresolved_deps.empty? then
      gem_original_require path
    else
      spec = Gem::Specification.find { |s|
        s.activated? and s.contains_requirable_file? path
      }

      unless spec then
        found_specs = Gem::Specification.find_in_unresolved path
        unless found_specs.empty? then
          found_specs = [found_specs.last]
        else
          found_specs = Gem::Specification.find_in_unresolved_tree path
        end

        found_specs.each do |found_spec|
          found_spec.activate
        end
      end

      return gem_original_require path
    end
  rescue LoadError => load_error
    if load_error.message.end_with?(path) and Gem.try_activate(path) then
      return gem_original_require(path)
    end

    raise load_error
  end

  private :require

end

I can run my application locally using rails -s, but I just can't seem to publish it to Heroku.

回答1:

iltempo and buru's answers helped me:

sudo apt-get install libreadline-dev

rvm remove 1.9.3

rvm install 1.9.3

Then add to your Gemfile:

gem 'rb-readline'


回答2:

Worked for me:

gem install rb-readline


回答3:

Such an error usually occurs when your rvm ruby was compiled without readline extension (which happens when there weren't readline headers installed before ruby compilation). So, try the following: install libreadline-dev, then reinstall ruby:

rvm remove 1.9.3 
rvm install 1.9.3


回答4:

Made it work for me!

gem 'rb-readline', "~> 0.5.0.pre.1", :require => false


回答5:

This link comes as the first in Google search so I'm going to clear up some confusion caused by the top answer.

The top answer is actually two answers merged into one. Both of them would fix your problem on their own, both have their strengths and weaknesses.

The first one is to install libreadline-dev and recompile your Ruby. This causes Ruby to be compiled with C readline support. It's potentially faster but adds another C dependency to your Ruby and has it's own set of disadvantages (for example you cannot be sure your linux distribution ships with GNU readline that has more features but is on LGPL license). It also doesn't work on certain platforms (Windows).

The second one is to install rb-readline, either by putting it in your Gemfile or by installing it globally (not recommended as you may switch to different Ruby version and have the same problem yet again). This is better for some because you now have pure-Ruby implementation that works on every platform but requires you to specify it in Gemfile (which shouldn't be much of a problem) and is potentially slower. To be honest I couldn't find any more problems with it.

The final choice is of course yours but if you're running multiple projects or multiple Ruby versions on the same machine, I'd go with installing libreadline-dev or whatever your distribution requires, mostly because you only have to do it once and then all newly compiled Rubies will work out of the box. But if you're trying to run just this one project, use "weird" platform (Windows), rb-readline is probably way to go.



回答6:

The easiest way to install dependencies for ruby is to run:

rvm remove 1.9.3

And then

rvm install 1.9.3

Before the last command actually installs ruby, it will ask you to install dependencies. In my case I got this tip:

sudo apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion pkg-config

This should be run in another terminal before continuing the install.



回答7:

Sounds like readline gem is requires by your application but not specified in your Gemfile. Please try to add it.



回答8:

If you happen to be using rbenv on Ubuntu

sudo apt-get install libreadline-dev
CONFIGURE_OPTS="--with-readline-dir=/usr/include/readline" rbenv install 1.9.3-p125

as written up at http://vvv.tobiassjosten.net/ruby/readline-in-ruby-with-rbenv/