2013-06-24 2 views
0

Я создаю веб-приложение Rails, которое использует общую библиотеку моделей (как Rails Engine), хранящихся в подрепозитории (поддерево Git). Эта общая библиотека содержит зависимости от других камней Ruby (в моем случае, HTTParty и Dalli), из которых я хочу автоматически ссылаться на родительский проект, который включает эту общую библиотеку.Рельсы: привязка к жемчужинам Ruby?

Однако зависимости моего gem, как представляется, не разрешаются в родительском проекте, и когда я запускаю свое веб-приложение, у него отсутствуют ссылки на эти зависимости gem в общей библиотеке. (т. е. NameError: uninitialized constant ApiClient::HTTParty) Если я явно добавлю эти ссылки к Gemfile моего веб-приложения (как в раскомментировании строк Gemfile ниже), все работает нормально.

Как я могу получить эти зависимости в цепочке, а родительский проект автоматически разрешит эти ссылки?

Вот что мой проект выглядит следующим образом:

[MyRailsApp] 
-- ... 
-- [app] 
-- [config] 
-- [lib] 
    -- [MyLib] 
    -- ... 
    -- [app] 
    -- [config] 
    -- [lib] 
     -- [MyLib] 
     -- version.rb 
     -- engine.rb 
    -- MyLib.gemspec 
    -- Gemfile 
-- Gemfile 

MyRailsApp/Gemfile:

source 'https://rubygems.org' 

gem 'activesupport', '3.2.13', :require => 'active_support' 
gem 'actionpack', '3.2.13', :require => 'action_pack' 
gem 'actionmailer', '3.2.13', :require => 'action_mailer' 
gem 'railties',  '3.2.13', :require => 'rails' 
... 
# gem 'dalli' 
# gem 'httparty' 

gem 'MyLib', :path => 'lib/MyLib' 

MyLib/MyLib.gemspec:

$:.push File.expand_path("../lib", __FILE__) 

# Maintain your gem's version: 
require "mylib/version" 

# Describe your gem and declare its dependencies: 
Gem::Specification.new do |s| 
    s.name  = "MyLib" 
    s.version  = MyLib::VERSION 
    s.authors  = ["David"] 
    s.email  = ["[email protected]"] 
    s.homepage = "http://www.mysite.com" 
    s.summary  = "Shared Library" 
    s.description = "Shared Library" 

    s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"] 

    s.add_dependency "rails", "~> 3.2.13" 
    s.add_dependency "dalli", ">= 2.6.4" 
    s.add_dependency "httparty", ">= 0.11.0" 
end 
+0

ли вы имеете в виду подмодуль в отличие от subrepository (ртутный)? –

+0

Технически поддерево, да, в отличие от подмодуля. –

ответ

2

Выяснил это. У меня была неправильная линия мышления ... Я думал, что Gemspecs, используемый для установки gem-зависимостей (который работает очень хорошо), также будет использоваться Rails для определения того, какие зависимости нужно загружать в память при запуске приложения. Это не так, по крайней мере, не при использовании Rails-движков.

Для среднего драгоценного камня кажется, что типичное веб-приложение Rails имеет строку в файле boot.rb, которая загружает все драгоценные камни и зависимости в приложении Gemfile. Однако эта автозагрузка не распространяется на механизмы Rails, перечисленные в Gemfile. В этом случае вы должны вручную загрузить свои зависимости в память приложения, найдя файл engine.rb (в вашем Rails-движке) и добавив require 'yourgem' в начале файла. Это будет загружать зависимость при загрузке двигателя.

Друг нашел и связал мне этот важный вопрос/ответ, если это объяснение не является достаточным: https://stackoverflow.com/a/5850503

1

Если вы хотите RubyGems понимать вас r, упакуйте каждый из них с соответствующим файлом .gemspec. Вам не нужно публиковать свой драгоценный камень, он может быть закрытым и указываться через URL-адрес git://.

Дело в том, что ваш .gemspec должен находиться на корневом уровне. Вы не можете похоронить его в своем проекте, так как Rubygems не делает этого, чтобы искать их.

В вашем случае использования, MyLib должно быть отдельной вещью.

+0

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

+0

@Dave Разрыв его в отдельные модули представляет собой немного боли впереди, но возможность самостоятельной проверки ваших зависимостей - огромная победа. Как только вы привыкнете к работе в разделенной среде, все будет в порядке. – tadman

+0

Спасибо, но для моей цели это невозможно. Хотя я хотел бы рассматривать библиотеку как независимый модуль, я не могу позволить себе совершать/нажимать/вытягивать изменения в моей общей библиотеке, просто чтобы увидеть, «если это сработало» в моей среде разработки. Можете ли вы представить, что нужно совершать/нажимать/вытаскивать каждый раз, когда вы меняете какой-либо файл при разработке приложения Rails? Это было бы безумием. И выясняется, что mylib/gemspec уважается родительским веб-приложением и устанавливает нужные мне зависимости. Вместо этого я был не в порядке, чтобы решить мою проблему. См. Мой ответ для более подробной информации. –

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