Ruby 1.9.2和Rails 3无法打开rails控制台

47
[gkaykck@main myApplication]$ rails console
/usr/local/lib/ruby/1.9.1/irb/completion.rb:9:in `require': no such file to load -- readline (LoadError)
    from /usr/local/lib/ruby/1.9.1/irb/completion.rb:9:in `<top (required)>'
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands/console.rb:3:in `require'
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands/console.rb:3:in `<top (required)>'
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands.rb:20:in `require'
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands.rb:20:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

我在ruby 1.9.2p136上安装了rails 3,这应该是没问题的。但我无法启动rails控制台并且它给了我一个错误信息。在ruby 1.8.7下,这个应用程序运行得非常好,我从未看到过这样的错误。

你们有什么想法吗?


1
你是怎么安装1.9.2的?你需要先安装readline并使用readline支持编译Ruby。此外,从堆栈跟踪来看,似乎正在使用1.9.1... - idlefingers
当你输入irb for 1.9.2时会发生什么?你能够require 'readline'吗? - fifigyuri
@idlefingers 我从源代码安装了1.9.2版本,如果我询问ruby -v,它会显示“ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux]”。我不知道readline的情况,但除了irb之外,一切正常。 - gkaykck
@fifigyuri,我不能要求读取行,所以我认为问题就在那里。 - gkaykck
3
Philippe 在类似问题的帖子中给出的答案适用于我:运行 gem install rb-readline 并将 gem 'rb-readline' 添加到你的 Gemfile 中。 - JJD
发现这个网址:http://happy-coding.com/require-no-such-file-to-load-readline-loaderror/ - H6.
10个回答

49

显然,Ubuntu和Ruby并不总是像他们应该的那样捕获依赖关系。

第一个谷歌搜索结果得知(是的,在查看第一个结果之前,我点击了位于第二位的这个Stack Overflow页面。)

导航到Ruby源代码并输入:

sudo apt-get install libreadline5-dev
cd ext/readline
ruby extconf.rb
make
sudo make install

因此,如果您使用的是其他发行版,请确保以某种方式安装readline(源/软件包),然后从源代码运行make/install extconf。当然,我尝试了gkaykck建议的方法,但在我的系统上没有安装readline时出现了这个问题。

$ ruby extconf.rb
checking for tgetnum() in -lncurses... no
checking for tgetnum() in -ltermcap... no
checking for tgetnum() in -lcurses... no
checking for readline/readline.h... no
checking for editline/readline.h... no

1
我实际上已经转移到了Windows,但是有人可能会发现这很有帮助,谢谢。 - gkaykck
谢谢,对于我来说在Ubuntu 10.04 LTS + ruby 1.9.2-p180上有效。 - Juanin
我想象一个生产环境的Ubuntu会表现出类似的行为。在实际生产/暂存环境中运行更改总是一个好主意。 - winfred
13
如果您使用rvm,请在以下目录中找到Ruby源代码:~/.rvm/src/ruby-版本号/ext/readline - DiveInto
1
http://vvv.tobiassjosten.net/ruby-on-rails/fixing-readline-for-the-ruby-on-rails-console/ - Mayank Jain
感谢提供此链接:http://rbjl.net/20-rubybuntu-2-troubleshooting-common-ruby-ubuntu-problems - Sahil Grover

29

对于使用rvm的人来说,下面是一份配方:

rvm pkg install readline
rvm remove 1.9.3
rvm install 1.9.3 --with-readline-dir=$rvm_path/usr

关于此更详细的信息请参见https://rvm.io/packages/readline/


为了使其正常工作,我必须首先使用rvm安装ruby 1.8.7。因此,我的步骤如下: - Pikachu
这个很完美地运行,我真的建议使用 rvm 或其他等效工具。 - Goles

11
如果您想要解决这个问题的其他方法,请按照以下步骤操作。
sudo apt-get install libreadline6

然后在您的gem文件中添加:

gem 'rb-readline'

那么

bundle install

然后你就准备好了。


在CentOS上也可以运行,无需安装libreadline。 - Geo
它在Mint上运行良好。这是解决此问题的快速解决方案。谢谢! - Luis Ortega Araneda
对我有用,谢谢!通过 rvm 安装在 Ubuntu 12.10 上的 Ruby 2.0.0。 - Alptigin Jalayr

5

首先卸载您计算机上的所有Ruby版本。

之后显示RVM要求:

rvm requirements

您将会得到类似于以下内容:

你将得到这样的东西:

Requirements for Linux ( DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.10
DISTRIB_CODENAME=oneiric
DISTRIB_DESCRIPTION="Ubuntu 11.10" )

NOTE: 'ruby' represents Matz's Ruby Interpreter (MRI) (1.8.X, 1.9.X)   
This is the *original* / standard Ruby Language Interpreter  
      'ree'  represents Ruby Enterprise Edition  
      'rbx'  represents Rubinius  

bash >= 4.1 required curl is required git is required (>= 1.7 for
ruby-head) patch is required (for 1.8 rubies and some ruby-head's).

To install rbx and/or Ruby 1.9 head (MRI) (eg. 1.9.2-head), then you
must install and use rvm 1.8.7 first.

Additional Dependencies: 
# For Ruby / Ruby HEAD (MRI, Rubinius, & REE), install the following:
  ruby: /usr/bin/apt-get install build-essential openssl libreadline6 
  libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev 
  libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev 
  ncurses-dev automake libtool bison subversion

# For JRuby, install the following:
  jruby: /usr/bin/apt-get install curl g++ openjdk-6-jre-headless
  jruby-head: /usr/bin/apt-get install ant openjdk-6-jdk

# For IronRuby, install the following:
  ironruby: /usr/bin/apt-get install curl mono-2.0-devel

通过apt-get安装所有依赖项。
之后安装ruby 1.8.7。如果您计划使用ruby 1.9.x,则需要此版本。
现在您可以安装ruby 1.9.3:

rvm pkg install readline
rvm remove 1.9.3
rvm install 1.9.3 --with-readline-dir=$rvm_path/usr

请注意,如果您已经使用apt-get安装了readline包,那么您甚至不需要通过rvm安装它。

5
我建议使用rvm(Ruby版本管理器)来管理您不同的Ruby版本并在它们之间切换。 它可以很好地为您编译各个版本。 您甚至可以创建每个目录的.rvmrc文件,告诉rvm在哪个目录中使用哪个ruby版本(如果需要,还可以使用每个项目的gem集!)

6
你不需要安装多个版本的 Ruby。即使只使用一个版本,也值得转换到 RVM。RVM 可以使 Ruby 管理更加方便,并且支持多个版本的 Ruby。 - mhmhmhmh
1
@gkaykck rvm 为我节省了大量的精力和时间。它不仅简化了 Ruby 版本管理,还可以维护不同 Ruby 项目的不同 gemsets。 - fifigyuri
2
使用RVM。相信我们的选择。 - zetetic
1
@gkaykck,RVM并不是什么邪恶的巫术或其他东西。它基本上只是一个命令行实用程序,为您安装的Rubies和gems执行一些路径管理。您仍然可以在Ruby安装中四处探索,只不过现在更容易找到了,因为您将在~/.rvm中找到整个Ruby树。 - futuremint
RVM已经过时且非常容易出错。请使用rbenv代替:https://github.com/sstephenson/rbenv - Houen
显示剩余3条评论

3

使用CentOS 6:

Remember we are working from the ruby install dir, for me it was:

   /opt/ruby-1.9.3-p194/ext/readline
如果你看到以下输出,那么 readline 没有安装:
$ ruby extconf.rb 
checking for tgetnum() in -lncurses... no
checking for tgetnum() in -ltermcap... no
checking for tgetnum() in -lcurses... no
checking for readline/readline.h... no
checking for editline/readline.h... no

使用RPM安装:

yum install readline-devel

然后构建它:

ruby extconf.rb 
make
sudo make install

这个解决方案在CentOS5上对我也起作用了。不过,我使用的是这个来源的解决方案:http://niwos.com/2011/04/15/fixing-ruby-readline-errors-on-centos/。 - Evgeniya Manolova

2
在Gemfile中添加
gem 'rb-readline'

然后运行bundle install命令

这对我来说起到了作用


1
解决方案是进入你编译的源文件夹 ruby => ext => readline 然后。
ruby extconf.rb
make
sudo make install

0

使用rvm remove命令删除所有已安装的Ruby。如果仍然可以找到ruby,请重新安装rvm,然后使用rvm安装Ruby。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接