1

我正在创建一个 Rails Web 应用程序,它使用一个共享模型库(作为 Rails 引擎),存储在一个子存储库(Git 子树)中。这个共享库包含对其他 Ruby gem 的依赖项(在我的例子中,HTTParty 和 Dalli),其中我想被包含这个共享库的父项目自动引用。

但是,我的 gem 的依赖项似乎没有在父项目中解析,当我启动我的 web 应用程序时,它缺少对共享库中那些 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       = ["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

3

弄清楚了。我的思路是错误的……我认为用于安装 gem 依赖项(工作得很好)的 Gemspecs 也将被 Rails 用来确定应用程序启动时需要将哪些依赖项加载到内存中。至少在使用 Rails 引擎时不是这样。

对于一般的 gem,一个典型的 Rails web 应用程序在 boot.rb 文件中有一行,它加载了应用程序 Gemfile 中的所有 gems 和依赖项。然而,这种自动加载似乎并没有扩展到 Gemfile 中列出的 Rails 引擎。在这种情况下,您必须手动将依赖项加载到应用程序内存中,方法是找到engine.rb文件(在 Rails 引擎中)并require 'yourgem'在文件开头添加。这将在引擎加载时加载依赖项。

如果这个解释不充分,一位朋友找到并链接了我这个相关的问题/答案: https ://stackoverflow.com/a/5850503

于 2013-06-24T17:54:08.880 回答
1

.gemspec如果您希望 ruby​​gems 了解您的依赖关系,请使用适当的文件将它们打包。您不必发布您的 gem,它可以是私有的并通过git://类型 URL 引用。

问题是,通常您.gemspec需要处于根级别。你不能把它埋在你的项目中,因为 Rubygems 不会特意去寻找这些。

在您的用例中,MyLib应该是一个单独的东西。

于 2013-06-24T15:19:17.753 回答