是宝石规格。 name必须等于gem常量名吗?

时间:2013-03-19 15:12:51

标签: ruby-on-rails rubygems ruby-on-rails-3.2 gem gemspecs

TL;博士

我试图将一个较大的应用程序的一部分作为可安装的引擎。引擎将以不同的风格存在,每种风格都包含在自己的宝石中。我不能让gem名称与引擎常量名称不同。

详细

提取的部分包含注册,身份验证和会话处理的逻辑。该应用程序被世界各地的客户使用,对使用该产品的最终客户有不同的要求和规定。这促使我们为每个监管区域创建了满足这些需求的单独模块。它们目前位于lib目录中,并根据配置加载不同的实现。

引擎的目标是安装适当的引擎,路由文件将所有相关的调用路由到引擎。

由于我们有几个这样的注册模块,以及更多的注册模块,我们需要为变体维护几个宝石。我试图让它成为宝石有不同的名称(auth_A,auth_B等),但包含的引擎具有相同的名称,Auth :: Engine。

这样我们就可以在Gemfile中包含正确的gem,其余的只会工作,因为无论运行什么版本,它应该路由到的端点始终是相同的。

问题

我遇到的问题是我无法接缝让宝石有一个名字而引擎又变得另一个......

如果我生成一个新的引擎名称auth,它可以正常安装在主应用程序中。如果我然后将gem名称和包含文件夹更改为auth_a并更新主机应用程序Gemfile它停止工作,我可以很好地捆绑但是当我尝试启动主机应用程序时它失败当它挂起引擎时,抱怨Auth ::引擎是一个未定义的常量。

我的,略有编辑,gemspec看起来像这样:

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

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

# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "auth_a"
  s.version     = Auth::VERSION
  s.authors     = ["Jonas Schubert Erlandsson"]
  s.email       = ["jonas.schubert.erlandsson@xxxxxx.com"]
  s.homepage    = "http://some.page.on/the/internet.html"
  s.summary     = "Authentication module for A"
  s.description = "This engine, when mounted in Host app, handles registration, account update, login and logout of users."

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

  s.add_dependency "rails", "~> 3.2.13"
end

我从生成的脚手架中唯一改变的是s.name = "auth_a"。来自主机应用Gemfile的相关行:gem 'auth_a', path: "../auth_a" ...

我查看了整个源代码树,试图找到它从宝石名称中推断出名称的位置,但我看不到它。我不知道我错过了什么,宝石规格文档对此没有多大帮助......我不认为宝石名称被绑定到宝石的常量名称,但也许我是错误?你可以覆盖它吗?或者我错过了其他什么?

1 个答案:

答案 0 :(得分:4)

答案是简单地将其添加到主机应用程序Gemfile中的行:gem 'auth_a', path: "../auth_a", require: 'auth'

所以它看起来默认需要,即自动加载,基于gem名称的常量,但require调用告诉它需要什么。

希望它能帮助别人:)