ImageScience ломается при обновлении до Rails 3
У меня была рабочая (и хорошо работающая) установка ImageScience, которая выполняла простое изменение размера изображений различных размеров, а затем копировала их в разные каталоги. Все очень просто. Эта небольшая и простая рутина была на граблях. После обновления до Rails 3 эта задача rake будет по-прежнему работать (она также выполняет некоторые вставки AR и кодирование звука), но требуется image_science с ошибками с таким сообщением,
"Не удалось /home//.ruby_inline/Inline_ImageScience_cdab.so"
Я исключил неудачную установку ImageScience, так как я могу зайти в IRB и сделать несколько простых вызовов ImageScience и сделать миниатюры. Остальная часть задачи rake работает так же, как и раньше, если я закомментирую любое упоминание о требовании image_science или подпрограмме ImageScience.
выход из грабли при сбое это,
/var/lib/gems/1.8/gems/RubyInline-3.8.6/lib/inline.rb:513:in `load'
/var/lib/gems/1.8/gems/RubyInline-3.8.6/lib/inline.rb:829:in `inline'
/var/lib/gems/1.8/gems/image_science-1.2.1/lib/image_science.rb:90
...
<active_support complaints >
...
/home/<user>/RailsApps/marlow/lib/tasks/flac_import.rake:2
...
<rails complaints>
...
/home/<user>/RailsApps/marlow/Rakefile:7
...
<standard complaints to end>
Rakefile в корне приложения rails - это стандартный и стандартный Rails 3 Rakefile, вот так:
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
require 'rake'
Marlow::Application.load_tasks
последняя строка - строка 7.
Я немного озадачен тем, что его нарушает, и Google, похоже, ничего не теряет. Кто-нибудь знает, почему RubyInline жалуется? Или почему эта однажды работающая задача Rake внезапно перестала работать, как называется ImageScience? Операционная система - Ubuntu 10.10, но она все работала до обновления Rails 3.
заранее спасибо
4 ответа
Похоже, это проблема, но есть более простое решение, которое я нашел, прочитав комментарии к проблемам Карлхуды 431
У меня была такая же проблема, и она работала для меня. Просто измените require
метод быть Kernel.require
,
После этого нет необходимости переть свой код с require image_science
заявления.
Есть исправление, но вам нужно прыгнуть через несколько обручей.
Первая задержка загрузки image_science:
gem 'image_science', :require => false
Затем патч обезьяны ruby-inline (на который полагается image_science). Поместите этот код в config/initializers/ruby_inline_hack.rb:
class Inline::C
def load
require "#{so_name}"
#below is the original version which breaks
#require "#{so_name}" or raise LoadError, "require on #{so_name} failed"
end
end
затем require 'image_science'
где бы вы не использовали это. И вуаля.
Одна заметка об ответе Аремава:
Похоже, в оригинальном коде есть ошибка! Он не использует кратковременную оценку!
class Inline::C
def load
require "#{so_name}" || raise LoadError, "require on #{so_name} failed"
end
end
Обратите внимание на ||, который остановит оценку логического выражения, если первая часть верна. Если в том же месте есть "или", вторая часть выражения всегда будет оценена, поэтому вы видите ошибку...
Как видно на трекере проблем с пакетами, у меня это сработало.
Направьте свой гем-файл на https://github.com/asynchrony/image_science Мы перестроили науку об изображениях без рубиновой строки.