Bạn nhận được thông báo phản đối này khiến thư viện ở một nơi nào đó yêu cầu iconv
.
iconv là đá quý được tạo bởi Matz có thể được sử dụng để chuyển đổi chuỗi từ định dạng này sang định dạng khác.
Ví dụ này thường được sử dụng:
Iconv.iconv('UTF-8//IGNORE', 'UTF-8', content)
bit này chút ma thuật phải mất một chuỗi UTF-8 mà có thể có ký tự không hợp lệ và chuyển đổi nó vào một hợp chuỗi UTF-8.
Nó đã được quyết định rằng trong Ruby 1.9.3 chúng ta không nên sử dụng iconv nữa và thay vào đó sử dụng được xây dựng trong String#encode. encode
mạnh mẽ hơn và cho phép bạn linh hoạt hơn.
Lý thuyết này là ví dụ trên có thể được thay thế bằng:
string.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => "?")
Trên thực tế có vẻ như đây là imperfect.
cũng Điều này dẫn đến một câu chuyện ít hơn dễ dàng cho người sáng tạo đá quý có nhu cầu hỗ trợ 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 => '')
Vì vậy, bạn có một viên ngọc ở đâu đó rằng đang yêu cầu iconv, để tìm thấy nó:
Giả sử thông báo lỗi của bạn là: /gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240
mở lên /gems/activesupport-3.1.0/lib/active_support/dependencies.rb
on line 240:
Thêm dòng:
p caller if file =~ /iconv/
(chỉ sau: load_dependency(file) { result = super }
)
Bạn sẽ nhận được một chất béo vết đống lớn:
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 ..
này nói với tôi nó là calais đá quý. Nhìn qua các yêu cầu kéo, tôi am not the first. Kéo không được kéo mạnh.
Tùy thuộc vào đá quý, có thể có phiên bản nâng cấp không có lỗi này, vì vậy tôi khuyên bạn nên nâng cấp đá quý trước. Nếu bạn không may mắn bạn có thể bị mắc kẹt với nhiệm vụ bất hạnh của forking một viên ngọc để thoát khỏi điều này (nếu ví dụ yêu cầu kéo của bạn để sửa chữa nó mòn mỏi)
Bởi chỉ cần thêm "p gọi" trên một dòng trước dòng load_dependency và nhìn qua đống dấu vết nó trở nên khá dễ dàng để shuffle qua Gemfile của bạn và sửa chữa các quá hạn đá quý. –
Tôi nghĩ rằng cách đơn giản nhất là chỉ cần thêm 'đặt" >>>> # {file.inspect} "' ngay trước 'load_dependency', sau đó bạn có thể xem tải tệp nào gây ra thư. –