1

サブリポジトリ (Git サブツリー) に格納されたモデルの共有ライブラリ (Rails Engine として) を使用する Rails Web アプリケーションを作成しています。この共有ライブラリには、他の Ruby gems (私の場合は HTTParty と Dalli) への依存関係が含まれています。この共有ライブラリを含む親プロジェクトから自動的に参照されるようにしたいです。

ただし、私の宝石の依存関係は親プロジェクトで解決されていないようで、Web アプリケーションを起動すると、共有ライブラリ内のそれらの宝石の依存関係への参照が欠落しています。(つまりNameError: uninitialized constant ApiClient::HTTParty) これらの参照を Web アプリの 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       = ["ops@myemail.com"]
  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
4

2 に答える 2

1

rubygems に依存関係を理解させたい場合は、それぞれを適切な.gemspecファイルでパッケージ化してください。gem を公開する必要はありません。非公開にして、git://タイプ URL を介して参照することができます。

問題は、通常.gemspec、ルートレベルにある必要があるということです。Rubygems はわざわざこれらを探すことはないので、プロジェクトに埋め込むことはできません。

あなたのユースケースでMyLibは、別のものでなければなりません。

于 2013-06-24T15:19:17.753 に答える