Rails Engine — зависимости Gems, как загрузить их в приложение?

Я делаю двигатель здесь, он работает нормально в автономном режиме.

Когда я преобразовываю его в гем и загружаю его в другое приложение, я получаю много неопределенных ошибок, возникающих из-за зависимостей моего гема движка.

Вот гемспек:

s.add_dependency('paperclip')
s.add_dependency('jquery-rails')
s.add_dependency('rails3-jquery-autocomplete')
s.add_dependency('remotipart')
s.add_dependency('cancan')

В приложении, когда я выполняю установку пакета, в нем перечислены все эти зависимости, но когда я запускаю приложение, я получаю много ошибок неопределенных методов (например, has_attachment из скрепки). Кажется, что приложение не загружает зависимости двигателей. Это поведение по умолчанию? Могу ли я изменить его? То же самое произошло с плагином внутри движка.

Если я вручную вставляю эти гемы в приложение Gemfile, все работает...


person Tiago    schedule 01.03.2011    source источник
comment
Вы видите их установленными в Gemfile.lock в приложении? Использует ли ваш движок Gemfile «gemspec» ниже источника? Если ваше приложение Gemfile.lock показывает эти установленные зависимости, я считаю, что они должны быть доступны в приложении. Если вы не видели этот пост, посмотрите его -› yehudakatz.com/2010/12/16/   -  person johnmcaliley    schedule 02.03.2011


Ответы (7)


Включите их в свой gemfile и запустите установку пакета. Затем потребуйте их в своем lib/<your_engine>/engine.rb file. Не забудьте потребовать rubygems

  require 'rubygems'
  require 'paperclip'
  require 'jquery-rails'
  require 'rails3-jquery-autocomplete'
  require 'remotipart'
  require 'cancan'

Затем в вашем хост-приложении (приложении, в которое вы включили свой драгоценный камень) запустите установку пакета / обновление пакета (обновление пакета помогло мне), и тогда все должно работать отлично. Вы также можете проверить это, запустив консоль в своем хост-приложении и просто набрав имя модуля, например.

Loading development environment (Rails 3.0.3)
irb(main):001:0> Paperclip
=> Paperclip

Надеюсь это поможет

person Daniël Zwijnenburg    schedule 01.05.2011
comment
Намерение OP состоит в том, чтобы не добавлять зависимости в Gemfile приложения, использующего движок. (У меня те же проблемы с плагином.) Все гемы появляются в Gemfile.lock, но, похоже, они не загружаются Rails автоматически. - person davemyron; 26.05.2011
comment
Если драгоценные камни установлены, потребуйте их в файле lib/‹your_engine›/engine.rb. - person Daniël Zwijnenburg; 26.05.2011
comment
@orangechicken - я думаю (возможно, неправильно), что требовать каких-либо зависимостей лежит на вашем движке / плагинах. Что также должно быть включено в gemspec. Я думаю, что Gemfile предназначен только для целей разработки. - person Kris; 28.09.2011
comment
@Kris: да, похоже, это тоже мои выводы. Движок рассматривается как обычный гем, и гем должен помещать свои зависимости в файл .gemspec. - person Marten Veldthuis; 12.12.2011
comment
@DaniëlZwijnenburg, не странно ли требовать их во второй раз? Однажды они объявлены как зависимости в файле .gemspec Энгинса. Поэтому они ДОЛЖНЫ быть загружены в приложение хостинга без какой-либо дополнительной команды require. Но это не так. - person Green; 17.06.2013
comment
У меня это не работает в Rails 4, что еще нужно добавить? - person loganathan; 10.04.2014
comment
Это работает в Rains 4.2.0 как движок, хотя и с другим набором драгоценных камней. - person Victor S; 26.02.2015

Вы можете потребовать их вручную, как написал Дэниел, а также вы можете потребовать их автоматически. Вам нужно добавить зависимости в 3 файлах:

  • yourengine.gemspec

    s.add_dependency "rails", '4.1.0'
    s.add_dependency "sqlite3"
    
  • Gemfile

    # Imports dependencies from yourengine.gemspec
    gemspec
    
  • lib/yourengine.rb

    # requires all dependencies
    Gem.loaded_specs['yourengine'].dependencies.each do |d|
     require d.name
    end
    
    require 'yourengine/engine'
    
    module Yourengine
    end
    

Обновление: это упрощенная демонстрация того, как требовать зависимости. Вы должны протестировать его и отфильтровать ненужные элементы, например: require d.name, если d.type == :development (спасибо @imsinu9)

person carlosvini    schedule 15.07.2014
comment
Это довольно аккуратно. К сожалению, некоторые драгоценные камни имеют разные соглашения об именах, и поэтому require d.name не сработает с LoadError, поэтому вам, возможно, придется немного потрудиться. - person David van Geest; 21.04.2015
comment
Этот последний цикл также загрузит все ваши зависимости разработки. :( - person John Hinnegan; 11.05.2016
comment
Я рекомендую require d.name unless d.type == :development, чтобы избежать загрузки зависимости разработки. - person imsinu9; 29.04.2018

из README от paperclip:

Для использования без Rails:

class ModuleName < ActiveRecord::Base
  include Paperclip::Glue
  ...
end

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

person tali    schedule 12.05.2014

Вы должны добавить файл gem как в файл .gemspec, так и в файл engine.rb. В файле .gemspec это будет выглядеть так: s.add_dependency "kaminari", "0.16.1"

В файле engine.rb вверху добавить: require "kaminari"

Я думаю, вам также нужно добавить гем в Gemfile движка рельсов и установить пакет, но я не уверен, нужен ли он вам там.

person yoyodunno    schedule 11.01.2016

В настоящее время (я думаю, что в Rails 3.1 и выше) вам больше не нужно было объявлять какие-либо драгоценные камни в файле test/dummy/Gemfile:

Цитата из test/dummy/Gemfile (сгенерирована с использованием rails plugin new my_engine --full):

Объявите зависимости вашего гема в simple_view_helpers.gemspec. Bundler будет рассматривать зависимости времени выполнения как базовые зависимости, а зависимости разработки будут добавлены по умолчанию в группу :development.

Объявляйте все зависимости, которые все еще находятся в разработке, здесь, а не в спецификации gemspec. Это могут быть Edge Rails или жемчужины вашего пути или Git. Не забудьте переместить эти зависимости в свою спецификацию драгоценных камней перед выпуском драгоценного камня на rubygems.org.

person Joshua Muheim    schedule 27.09.2012

Вам действительно не нужно их на Gemsec, и они должны быть загружены. Когда вы говорите «вот спецификация драгоценных камней», вы окружаете ее Gem::Specification.new do |s| или чем-то в этом роде, верно?

person chesterbr    schedule 14.01.2013

Вы можете включить все драгоценные камни для среды с помощью простой команды упаковщика:

Bundler.require(*Rails.groups)

Вы можете добавить это в config/initializer.

person sbonami    schedule 08.01.2017