由于readline出现错误,无法执行“rails console”。

87

由于以下错误,我无法执行rails console:

localhost:TwitterForZombies wiz$ rails c
/Users/wiz/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/irb/completion.rb:9:in `require': dlopen(/Users/wiz/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin12.2.1/readline.bundle, 9): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.2.dylib (LoadError)
  Referenced from: /Users/wiz/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin12.2.1/readline.bundle
  Reason: image not found - /Users/wiz/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin12.2.1/readline.bundle
    from /Users/wiz/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/irb/completion.rb:9:in `<top (required)>'
    from /Users/wiz/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.9/lib/rails/commands/console.rb:3:in `require'
    from /Users/wiz/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.9/lib/rails/commands/console.rb:3:in `<top (required)>'
    from /Users/wiz/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.9/lib/rails/commands.rb:38:in `require'
    from /Users/wiz/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.9/lib/rails/commands.rb:38:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
我已经通过Homebrew安装了readline。 我想继续使用rbenv而不是rvm。
谢谢阅读我的问题。

可能是rails console doesn't load due to libreadline的重复问题。 - Santhosh
8个回答

277

最近我在使用homebrew和libreadline.7.x.dylib / libreadline.6.x.dylib时遇到了同样的问题。

解决方法是运行:

ln -s /usr/local/opt/readline/lib/libreadline.7.0.dylib /usr/local/opt/readline/lib/libreadline.6.dylib

来源: https://github.com/rails/rails/issues/26658


1
多么巧妙的 hack :) 但它现在可以正常工作 :D 谢谢! - haslo
18
使用符号链接来欺骗系统使用实际上是不同(主要!)版本号的做法通常是一个不好的想法。如果有更熟悉的人可以解释一下为什么上述修复是安全的,那就太好了。 使用符号链接欺骗系统使用实际上是不同(甚至是主要版本的)版本号通常是不好的做法。如果有更熟悉的人能解释上述修复方式为何安全,将会更好。 - Pistos
你是个传奇,谢谢你做到了这一点,@wiz 应该把你标记为正确的! - Nick Schwaderer
1
仔细查看libreadline 6.3和7.0之间的更改,没有发现任何可能会产生破坏性影响的变化,除非某些软件依赖于未记录或有缺陷的行为。考虑到这一点,我对尝试此解决方案感到放心。 - Lyndsy Simon

58

Homebrew很好用,但偶尔它可能与其他组件不兼容。

brew update && brew upgrade 命令会升级一些库,比如这次升级了 libreadline.7.x.dylib 并自动删除 libreadline.6.x.dylib,但 Ruby 仍依赖于被删除的那个库。

也许有更巧妙的方法来解决这个问题,但对我来说采用了"粗力"(brute force)的方式:

$ rbenv uninstall 2.3.1
$ rbenv install 2.3.1
$ cd /path/to/my/app
$ bundle

上述假设您已经安装了 rbenv 的 ruby-build 以及必备的 bundler;如果您使用的 Ruby 版本不同,请将 2.3.1 替换为相应的版本号。

请注意,类似问题也可能出现在其他由 Homebrew 管理的库中(例如:请参见我自己对此的回答)。


刚刚发生了同样的事情 - 我想知道是否有办法让Homebrew注意到某些库已链接到Homebrew提供的某些旧版本? - slhck
2
这在我的El Capitan上有效,安装rbenv后执行gem install bundler - handwovensole
当我再次运行 brew update && brew upgrade 时,会发生错误吗? - Frank Fang
1
@FrankFang,这可能发生,也可能不会,而且不仅仅是针对这个特定的错误。每次brew upgrade用更新的版本替换任何旧库时,都有一些机会导致系统中的其他程序出现问题。 - Giuseppe

26

我使用的是OSX操作系统,ruby版本为2.3.0,rails版本为5。在我的Gemfile中添加gem 'rb-readline'即可解决这个问题。


1
gem rb-readline 对我很有用。我将它添加到了 :development, :test 组中 - 很好的快速修复! - tnum

20

正如Sachin所暗示的,安装readline并重新安装ruby是理想的方法 - 但对于rbenv而言,细节有些不同。考虑到你的文件路径,我猜你在使用Mac,所以以下内容应该会有所帮助:

brew install readline ruby-build
env CONFIGURE_OPTS=--with-readline-dir=`brew --prefix readline` rbenv install 1.9.3-p286

这是从ruby-build维基和快速谷歌搜索中获取的。


不要忘记在完成此操作后重新散列。 - Igbanam
2
重新安装带有readline的现有Ruby版本后,运行诸如“bundle install”之类的命令会显示许多警告,例如“因其扩展未构建而忽略bcrypt-3.1.11”。如this question中所建议的那样,gem pristine --all一次性解决了所有这些错误。 - Rory O'Kane

20

我使用 Ruby 2.1.0 和 rails 4.0 时遇到了相同的错误。经过大量搜索和尝试,最终问题得到解决:) 这是我所做的:

rvm cleanup all
rvm autolibs enable
rvm install 2.1.0 

其他的方法:

brew update
brew uninstall readline
brew install readline

autolibs命令将强制安装RVM的所有依赖项,因此您不需要担心它。

希望这有所帮助。


2
你可能不需要“清理 rvm”。只需“重新安装”Ruby 版本即可。 - Swaps

8

如果使用 Mac 操作系统,El Capitan 版本,则可以通过以下方式轻松解决:

rvm reinstall your_ruby_version

(例如rvm reinstall ruby-2.3.1

希望这可以帮到你,祝好运!


这就是我需要做的所有事情。 - Pistos
这将重新安装您当前的版本:rvm reinstall $(rvm current) - CTS_AE
这是最简单的解决方案,但需要一些时间重新安装。在我看来仍然是最好的方法。 - f055

1
从github用户@enderahmetyurt获取(这是唯一对我有效的解决方案)。

解决方案:在你的Gemfile中添加gem 'rb-readline'开发组并运行bundle install

这是愚蠢的“readline”错误的最简单解决方案。

0

谢谢您的回答,但是是否有一种方法可以继续使用rbenv而不是rvm? - wiz

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