iconv dépréciation d'avertissement avec ruby 1.9.3
Je suis de cet avertissement quand je lance rspec:
/gems/activesupport-3.1.0/lib/active_support/dépendances.rb:240:dans "le bloc dans le besoin": iconv sera obsolète dans l'avenir, utiliser des chaînes de caractères#encoder à la place.
Je reçois le même message d'avertissement avec rails 3.1.0
, 3.1.1
, 3.1.2.rc2
versions. Semble que c'est lié à sqlite3
gem, mais je ne suis pas sûr. Il n'y a pas d'avertissements avec ruby 1.9.2
Toutes les suggestions sur la manière de traiter avec elle?
Vous devez vous connecter pour publier un commentaire.
Vous obtenez cette dépréciation de l'avis de provoquer une bibliothèque, quelque part, en exigeant
iconv
.iconv est un bijou créé par Matz qui peut être utilisé pour convertir des chaînes à partir d'un format à un autre.
Par exemple c'est souvent utilisée:
Iconv.iconv('UTF-8//IGNORE', 'UTF-8', content)
ce petit brin de magie prend une chaîne UTF-8 qui peuvent avoir des caractères non valides et de les convertir en un bon de chaîne UTF-8.Il a été décidé que, dans Ruby 1.9.3 nous ne devrions pas utiliser iconv plus et au lieu d'utiliser le haut -String#coder.
encode
est plus puissant et permet plus de flexibilité.La théorie est que l'exemple ci-dessus pourrait être remplacé par:
string.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => "?")
Dans la pratique, il semble que ce soit imparfait.
Cela conduit également à moins de l'histoire facile pour les créateurs qui souhaitent soutenir 1.8:
Donc, vous avez un bijou quelque part qui est exigeant iconv, pour le trouver:
En supposant que votre message d'erreur est:
/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240
Ouvrir
/gems/activesupport-3.1.0/lib/active_support/dependencies.rb
sur la ligne 240:Ajouter la ligne:
(juste après:
load_dependency(file) { result = super }
)Vous obtiendrez une grosse trace de la pile:
Cela me dit qu'il est le calais gem. La recherche à travers des pull requests, je ne suis pas le premier. Le pull n'a pas été arrachés dans.
En fonction de la gemme, il peut y avoir une version mise à jour qui n'ont pas cette erreur, je vous recommande de mettre à niveau vos bijoux en premier. Si vous êtes malchanceux, vous pourriez être coincé à la triste tâche de bifurquer un bijou pour se débarrasser de ce (si par exemple votre pull request pour le fixer languit)
p caller if file.to_s =~ /iconv/
(fichier est maintenant un Chemin au lieu d'une Chaîne).Si vous voyez ceci, c'est très probablement pas Rails. Si vous regardez la méthode entourant la ligne mentionné dans l'erreur que vous avez posté, vous verrez suivantes:
Je ne dis pas que c'est votre code, forcément, mais je suis certain que ce n'est pas vraiment la ligne en question où iconv est appelé. Dans mon cas, j'ai trouvé que mon projet de code fait référence à iconv.
Si vous voulez vérifier votre code pour une telle référence, essayez
grep -ir iconv ./
dans votre répertoire de projet.Quand
iconv
est en fait dans une bibliothèque, il peut être plus difficile à trouver. En changeant temporairement la méthode ci-dessus pour:Vous pouvez facilement exécuter votre code et grep les lignes de la trace pour trouver la cause de l'avertissement.
puts ">>>> #{file.inspect}"
juste avantload_dependency
, alors vous pouvez voir le fichier de chargement a provoqué le message.Ajouter ceci au début de votre programme:
et maudire les gens qui pensent que c'est un professionnel de la poignée de manière autodérision.
require
s qui pourrait peut-être tirer dansiconv
dans certains profondément imbriquésrequire
de la chaîne, puis le message n'apparaîtra plus.Vous pouvez déterminer l'emplacement exact de l'avertissement en générant des exceptions pour ActiveSupport::Autodérision, au lieu de juste l'impression du journal. En haut de l'application.rb:
Une fois que vous avez compris où l'avertissement est à venir à partir de (en inspectant le backtrace complet), retirez-la de nouveau.
undefined method behaviour= for ActiveSupport::Deprecation:Module (NoMethodError)
-- Rails 3.2.3, Ruby 1.9.3-p125require 'rails/all'
.Pour supprimer cet avertissement...
allez à la votre .rvm répertoire et trouver
iconv.c
(le mien était à~/.rvm/src/ruby-1.9.3-p125/ext/iconv/iconv.c
)modifier ce fichier sont les supprimer ou mettre en commentaire l'appel à
warn_deprecated()
(doit être proche du bas)à partir de ce répertoire du fichier, exécutez
ruby extconf.rb
puis
make
puis
make install
Devrait faire l'affaire