2010-11-25 2 views
3

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

«требуется на /home//.ruby_inline/ Inline_ImageScience_cdab.so failed "

Я исключил установку Duff ImageScience, поскольку я могу войти в IRB и сделать несколько простых вызовов ImageScience и сделать миниатюры. Остальная часть задачи рейка работает так же хорошо, как и раньше, если я прокомментирую любое упоминание о требовании «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 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 

последней строка line 7.

Я как бы заперт от того, что нарушает его, и Google, похоже, ничего не проливает. Кто-нибудь знает, почему RubyInline жалуется? Или почему эта некогда работающая задача Rake внезапно недовольна тем, как называется ImageScience? OS - Ubuntu 10.10, но все это работало до обновления Rails 3.

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

ответ

2

Это, как представляется, проблема, но есть более простой фикс я нашел из просматривал комментарии в carlhuda issues 431

У меня была та же проблема, и она работала для меня. Просто измените метод require на Kernel.require.

После этого нет необходимости перекосить код с помощью require image_science инструкций.

1

Существует исправление, но вам придется прыгать через несколько обручей.

Первая задержка image_science нагрузка:

gem 'image_science', :require => false

Тогда обезьяна патч рубиново-рядный (который image_science полагается на). Поместите этот код в конфиге/инициализаторах/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' везде, где вы используете его. И вуаля.

+0

большое спасибо, я дам это попробовать. С тех пор я «исправил» вопрос, заменив ImageScience на devil (https://github.com/banister/devil). Но я хотел бы попробовать все равно. – CleverCaviar 2010-12-18 10:04:40

+0

, так что вы просто не поднимаете ошибку - но как это исправить? как он будет работать, если библиотека не была загружена? – Tilo 2011-04-24 16:40:40

+0

Оригинальная линия не использует короткое замыкание-оценка! например он должен использовать || вместо «или» или « – Tilo 2011-04-24 16:47:30

0

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

Похоже, что исходный код содержит ошибку! Он не использует короткую оценку!

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

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

Смежные вопросы