Rails Engine - зависимости Gems, как загрузить их в приложение?
Я делаю двигатель здесь, он работает хорошо в одиночестве.
Когда я превращаю его в драгоценный камень и загружаю его в другое приложение, я получаю много ошибок undefined, исходящих из моих зависимостей gem engine.
Вот пример gemspec:
s.add_dependency('paperclip')
s.add_dependency('jquery-rails')
s.add_dependency('rails3-jquery-autocomplete')
s.add_dependency('remotipart')
s.add_dependency('cancan')
В приложении, когда я устанавливаю пакет, он перечисляет все эти зависимости, но когда я запускаю приложение, я получаю много ошибок undefined методов (например, has_attachment из paperclip). Похоже, что приложение не загружает зависимости от двигателей.
Это поведение по умолчанию? Могу я его изменить?
То же самое произошло с плагином внутри двигателя.
Если я вставляю вручную эти драгоценные камни, в приложении Gemfile все работает...
Ответы
Ответ 1
Включите их в свой gemfile и запустите установку пакета. Затем требуйте их в lib/<your_engine>/engine.rb file
. Не забудьте потребовать рубигемы
require 'rubygems'
require 'paperclip'
require 'jquery-rails'
require 'rails3-jquery-autocomplete'
require 'remotipart'
require 'cancan'
Затем в вашем хост-приложении (приложение, в которое вы включили свой драгоценный камень) запустите пакет install/bundle update (пакетное обновление сделало трюк для меня), а затем все должно работать отлично. Вы также можете проверить это, запустив консоль в своем хост-приложении и просто введите имя модуля, например.
Loading development environment (Rails 3.0.3)
irb(main):001:0> Paperclip
=> Paperclip
Надеюсь, что это поможет
Ответ 2
Вы можете потребовать их вручную, как отправленный Daniel, и вы также можете потребовать их автоматически. Вам нужно добавить зависимости в 3 файла:
-
yourengine.gemspec
s.add_dependency "rails", '4.1.0'
s.add_dependency "sqlite3"
-
Gemfile
# Imports dependencies from yourengine.gemspec
gemspec
-
Библиотека/yourengine.rb
# requires all dependencies
Gem.loaded_specs['yourengine'].dependencies.each do |d|
require d.name
end
require 'yourengine/engine'
module Yourengine
end
Ответ 3
from paperclip README:
Использование Non-Rails:
class ModuleName < ActiveRecord::Base
include Paperclip::Glue
...
end
У меня была такая же проблема, и я исправил ее для меня.
Ответ 4
Вы должны добавить файл gem в файл .gemspec и файл engine.rb.
В файле .gemspec это будет выглядеть так: s.add_dependency "kaminari", "0.16.1"
В файле engine.rb вверху добавить: require "kaminari"
Я думаю, вам также нужно добавить драгоценный камень в движок gimfile и установить пакет, но я не уверен, что вам это нужно.
Ответ 5
В настоящее время (Rails 3.1 и выше, я думаю), вам больше не нужно было объявлять какие-либо драгоценные камни в файле test/dummy/Gemfile:
Цитата из test/dummy/Gemfile (сгенерирована с помощью rails plugin new my_engine --full
):
Объявите свои зависимости от gem в simple_view_helpers.gemspec. Bundler будет обрабатывать зависимости времени выполнения, такие как базовые зависимости, и зависимостей разработки будут добавлены по умолчанию в группу: development.
Объявить любые зависимости, которые все еще находятся в разработке здесь, а не в ваш gemspec. К ним могут относиться ребра Rails или драгоценные камни с вашего пути или Git. Не забудьте переместить эти зависимости в ваш gemspec перед выпуском ваш драгоценный камень на rubygems.org.
Ответ 6
Вам действительно не нужны они на Gemsec, и они должны быть загружены. Когда вы говорите "вот гемспик", вы окружаете его с помощью Gem::Specification.new do |s|
или что-то в этом роде, верно?
Ответ 7
Вы можете включить все камни для среды с помощью простой команды bundler:
Bundler.require(*Rails.groups)
Вы можете добавить это к config/initializer
.