Подтвердить что ты не робот

Предупреждение о предупреждении iconv с рубином 1.9.3

Я получаю это предупреждение при запуске 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.

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

Любые предложения, как с этим бороться?

4b9b3361

Ответ 1

Вы получаете это уведомление об изъятии, потому что где-то в библиотеке требуется 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 ..

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


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

Ответ 2

Если вы видите это, это, скорее всего, не 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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Должен сделать трюк