Предупреждение о предупреждении 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
Любые предложения, как с этим бороться?
Ответы
Ответ 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
Должен сделать трюк