J'essaie de déployer mon Rails application sur Heroku pour le tester en suivant ces instructions:
http://devcenter.heroku.com/articles/Rails3#prerequisites
Voici la commande que j'essaie d'exécuter:
heroku create --stack cedar
Et je reçois ce message d'erreur:
/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>'
Et voici le contenu du fichier en 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
Je peux exécuter mon application localement en utilisant Rails -s
, mais je n'arrive pas à le publier sur Heroku.
les réponses d'iltempo et de buru m'ont aidé:
Sudo apt-get install libreadline-dev
rvm remove 1.9.3
rvm install 1.9.3
Then add to your Gemfile:
gem 'rb-readline'
A travaillé pour moi:
gem install rb-readline
Une telle erreur se produit généralement lorsque votre rvm Ruby a été compilé sans extension readline (ce qui se produit lorsqu'il n'y avait pas d'en-têtes readline installés avant Ruby). Donc, essayez ce qui suit: installez libreadline-dev, puis réinstallez Ruby:
rvm remove 1.9.3
rvm install 1.9.3
Je l'ai fait fonctionner pour moi!
gem 'rb-readline', "~> 0.5.0.pre.1", :require => false
Ce lien est le premier de la recherche Google, donc je vais dissiper une certaine confusion causée par la première réponse.
La première réponse est en fait deux réponses fusionnées en une seule. Les deux régleraient votre problème par eux-mêmes, tous deux ont leurs forces et leurs faiblesses.
La première consiste à installer libreadline-dev
et recompilez votre Ruby. Cela provoque Ruby à être compilé avec le support de ligne de lecture C. C'est potentiellement plus rapide mais ajoute une autre dépendance C à votre Ruby et a son propre ensemble d'inconvénients (par exemple vous ne pouvez pas être sûr que votre distribution linux est livrée avec GNU readline qui a plus de fonctionnalités mais qui est sous licence LGPL). Il ne fonctionne pas non plus sur certaines plates-formes (Windows).
La seconde consiste à installer rb-readline
, soit en le mettant dans votre Gemfile soit en l'installant globalement (non recommandé car vous pouvez passer à une autre Ruby version et avoir à nouveau le même problème). C'est mieux pour certains parce que vous avez maintenant une implémentation pure Ruby qui fonctionne sur chaque plate-forme mais vous oblige à la spécifier dans Gemfile (ce qui ne devrait pas être un gros problème) et est potentiellement plus lente. Pour être honnête, je n'ai pas pu trouver plus de problèmes avec elle.
Le choix final est bien sûr le vôtre, mais si vous exécutez plusieurs projets ou plusieurs versions Ruby sur la même machine, j'irais avec l'installation de libreadline-dev
ou tout ce dont votre distribution a besoin, principalement parce que vous n'avez à le faire qu'une seule fois, puis tous les Rubis nouvellement compilés fonctionneront hors de la boîte. Mais si vous essayez d'exécuter ce seul projet, utilisez la plate-forme "bizarre" (Windows), rb-readline est probablement le chemin à parcourir.
La façon la plus simple d'installer des dépendances pour Ruby est d'exécuter:
rvm remove 1.9.3
Puis
rvm install 1.9.3
Avant que la dernière commande n'installe réellement Ruby, elle vous demandera d'installer les dépendances. Dans mon cas, j'ai eu cette astuce:
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
Cette opération doit être exécutée dans un autre terminal avant de poursuivre l'installation.
Si vous utilisez rbenv sur Ubuntu
Sudo apt-get install libreadline-dev
CONFIGURE_OPTS="--with-readline-dir=/usr/include/readline" rbenv install 1.9.3-p125
comme écrit à http://vvv.tobiassjosten.net/Ruby/readline-in-Ruby-with-rbenv/
Cela ressemble à un bijou readline requis par votre application mais non spécifié dans votre Gemfile. Veuillez essayer de l'ajouter.