ImageScience ломается при обновлении до Rails 3

У меня была работающая (и хорошо работающая) установка ImageScience, которая выполняла простое изменение размера изображений до различных размеров, а затем копировала их в разные каталоги. Все очень просто. Эта небольшая и простая процедура была в задаче грабли. После обновления до Rails 3 эта задача rake по-прежнему будет работать (она также выполняет некоторые вставки AR и кодирование звука), но запрос image_science завершается с ошибкой с сообщением вроде этого:

«требовать на /home//.ruby_inline/Inline_ImageScience_cdab.so не удалось»

Я исключил ошибочную установку ImageScience, так как могу зайти в IRB и сделать несколько простых вызовов ImageScience и сделать эскизы. Остальная часть задачи rake работает так же, как и раньше, если я закомментирую любое упоминание о необходимости использования «image_science» или процедуры ImageScience.

вывод rake при неудаче таков,

/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 является стандартным Rakefile Rails 3, например,

# 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.

заранее спасибо


person CleverCaviar    schedule 25.11.2010    source источник


Ответы (4)



Есть исправление, но вам нужно прыгнуть через несколько обручей.

Первая задержка загрузки 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' везде, где вы его используете. И вуаля.

person artemave    schedule 17.12.2010
comment
большое спасибо, я попробую, анон. С тех пор я исправил эту проблему, заменив ImageScience на devil (github.com/banister/devil) . Но, я хотел бы попробовать это в любом случае. - person CleverCaviar; 18.12.2010
comment
так что вы просто не поднимаете ошибку - но как это исправить? как это будет работать, если библиотека не была загружена? - person Tilo; 24.04.2011
comment
исходная строка не использует краткую оценку! например он должен использовать || вместо или - person Tilo; 24.04.2011
comment
@Tilo: так что вы просто не вызываете исключение ошибки, которое все равно возникает, если require не может загрузить библиотеку - person artemave; 26.04.2011
comment
@Tilo: «он должен использовать || вместо или' в любом случае то же самое в этом конкретном случае - person artemave; 26.04.2011

Одно примечание к ответу aremave:

Похоже, в исходном коде есть ошибка! Это не использование быстрой оценки!

class Inline::C
  def load
    require "#{so_name}" || raise LoadError, "require on #{so_name} failed"
  end
end

Обратите внимание на || , что остановит вычисление логического выражения, если первая часть верна. Если в том же месте есть «или», вторая часть выражения всегда будет оцениваться, поэтому ошибка, которую вы видите...

person Tilo    schedule 24.04.2011
comment
«...если первая часть верна», но это не обязательно. require возвращает nil/false, если гем уже загружен. - person artemave; 26.04.2011
comment
Вы также, кажется, смущены разницей между || и or. or равно || с более низким приоритетом. Учтите следующее: b = nil; a = b or do_stuff будет do_stuff и сохранит a = nil, тогда как b = nil; a = b || do_stuff присвоит возвращаемое значение do_stuff a. - person artemave; 26.04.2011
comment
нет, совсем не запутался в || vs или .. но не понимал, что require может вернуть nil, если он уже загружен (и тогда, конечно, вам не нужна ошибка ..) - person Tilo; 08.05.2011
comment
Ах! Я понимаю. Ваша версия по существу идентична require ("#{so_name}" or raise LoadError), и в этом случае она также идентична просто require "#{so_name}", поскольку "#{so_name}" всегда верно, и повышение никогда не произойдет. - person artemave; 08.05.2011

как видно из системы отслеживания ошибок, у меня это сработало.

Укажите свой файл gem на https://github.com/asynchrony/image_science. Мы перестроили науку об изображениях без встроенного ruby. .

person Thiago Diniz    schedule 06.05.2011