iconv предупреждение об устаревании с ruby ​​1.9.3 - PullRequest
35 голосов
/ 16 ноября 2011

Я получаю это предупреждение при запуске rspec:

/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240:in `block in require': iconv will be deprecated in the future, use String#encode instead.

Я получаю то же самое предупреждение с версиями rails 3.1.0, 3.1.1, 3.1.2.rc2.Кажется, это связано с sqlite3 драгоценным камнем, но я не уверен.Там нет предупреждений с ruby ​​1.9.2

Есть предложения как с этим бороться?

Ответы [ 5 ]

69 голосов
/ 02 июля 2012

Вы получаете это уведомление об устаревании, потому что библиотека где-то требует iconv.

iconv - это камень, созданный Matz , который можно использовать для преобразования строк из одного формата в другой.

Например, это часто используется:

Iconv.iconv('UTF-8//IGNORE', 'UTF-8', content) этот маленький кусочек магии берет строку UTF-8, которая может иметь недопустимые символы, и преобразует ее в правильную строку UTF-8.

Было решено, что в Ruby 1.9.3 мы больше не должны использовать iconv, а вместо этого используем встроенную String # encode .encode является более мощным и дает вам больше гибкости.

Теория заключается в том, что приведенный выше пример можно заменить на:

string.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => "?")

На практике это выглядит как несовершенный .

Это также ведет к не простой истории для создателей драгоценных камней, которые хотят поддержать 1.8:

content = RUBY_VERSION.to_f < 1.9 ? 
  Iconv.iconv('UTF-8//IGNORE', 'UTF-8',  "content") :
  "#{content}".encode(Encoding::UTF_8, :invalid => :replace, :undef => :replace, :replace => '')

Итак, у вас есть где-то камень, требующий iconv, чтобы найти его:

Предполагается, что ваше сообщение об ошибке: /gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240

Откройте /gems/activesupport-3.1.0/lib/active_support/dependencies.rb в строке 240:

Добавьте строку:

p caller if file =~ /iconv/

(простопосле: load_dependency(file) { result = super })

Вы получите большой след стека жира:

 rake --tasks
/home/sam/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.6/lib/active_support/dependencies.rb:251:in `block in require': iconv will be deprecated in the future, use String#encode instead.
["/home/sam/.rvm/gems/ruby-1.9.3-p125/gems/calais-0.0.13/lib/calais.rb:5:in `'", 
.. more omitted ..

Это говорит о том, что это камень кале .Просматривая запросы на включение, я не первый .Пул не был восстановлен.


В зависимости от драгоценного камня, может быть обновленная версия, в которой нет этой ошибки, поэтому я рекомендую сначала обновить ваши драгоценные камни.Если вам не повезло, вы можете столкнуться с неудачной задачей разветвления драгоценного камня, чтобы избавиться от этого (если, например, ваш запрос на восстановление для его исправления устарел)

17 голосов
/ 19 марта 2012

Если вы видите это, то очень вероятно не Rails.Если вы посмотрите на метод, окружающий строку, на которую ссылаются в сообщенной вами ошибке, вы увидите следующее:

def require(file, *)
  result = false
  load_dependency(file) { result = super }
  result
end

Я не говорю, что это ваш код, обязательно, но я уверенчто на самом деле это не та строка, где вызывается iconv.В моем случае я обнаружил, что код моего проекта на самом деле содержит ссылку на iconv.

Если вы хотите проверить свой код на наличие такой ссылки, попробуйте grep -ir iconv ./ в каталоге вашего проекта.

Когда iconv действительно находится в библиотеке, найти его будет сложнее.Временно изменив вышеуказанный метод на:

def require(file, *)
  result = false
  puts
  puts caller.reverse
  load_dependency(file) { result = super }
  result
end

Затем вы можете легко запустить свой код и выполнить поиск соответствующих строк обратной трассировки, чтобы найти основную причину предупреждения.

ruby your/code.rb 2>&1 | grep -B 5 iconv
8 голосов
/ 21 апреля 2012

Добавьте это в начало вашей программы:

oldverb = $VERBOSE; $VERBOSE = nil
require 'iconv'
$VERBOSE = oldverb

и проклинайте людей, которые считают, что это профессиональный способ справиться с обесцениванием.

7 голосов
/ 29 апреля 2012

Вы можете определить точное местоположение предупреждения, создавая исключения для ActiveSupport :: Deprecation вместо простой печати в журнал.В верхней части application.rb:

ActiveSupport::Deprecation.behavior = Proc.new do |message, backtrace|
  raise message
end

Как только вы выяснили, откуда исходит предупреждение (проверив полную обратную трассировку), удалите его снова.

0 голосов
/ 18 сентября 2014

Чтобы удалить это предупреждение ...

перейдите в каталог .rvm и найдите iconv.c (у меня было ~/.rvm/src/ruby-1.9.3-p125/ext/iconv/iconv.c)

изменить этот файл, удалить или закомментироватьвызовите warn_deprecated() (должно быть внизу)

из каталога этого файла, запустите ruby extconf.rb, затем make, затем make install

. Нужно сделать трюк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...