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 Мы перестроили науку об изображениях без рубиновой строки.

Другие вопросы по тегам