2013-03-19 73 views
2

tl; dr

我正试图作为一个可安装的引擎分离出一个更大的应用程序的一部分。发动机将以不同的口味存在,每个都包含在他们自己的宝石中。我无法让宝石名称与引擎常量名称不同。做宝石规格。名称必须等于宝石常数名称?

详细

所提取的部分包含用于注册,认证和会话处理逻辑。该应用程序由全球不同地区的客户使用,针对使用该产品的最终客户提出不同的要求和规定。这促使我们为每个监管区域的这些需求创建单独的模块。他们目前生活在lib目录中,并且根据配置加载不同的实现。

与发动机的目标是,你安装适当的引擎和文件航线航线所有有关调用引擎。

因为我们有几个这样的登记模块,并且更多的惊喜,我们需要保持的变种几个宝石。我试图让这些宝石具有不同的名称(auth_A,auth_B等),但是包含的引擎具有相同的名称Auth :: Engine。

这样,我们就可以包括在Gemfile中,其余正确的创业板将只是工作,因为它应该击溃到端点总是相同的,无论是运行的是什么版本的。

问题

我运行的问题是,我不能缝拿到宝石有一个名字和发动机恒定的另一...

如果我生成一个新的引擎名称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  = ["[email protected]"] 
    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" ...

我已经浏览了整个源代码树,试图找到它从gem名称中推断出一个名称,但我看不到它。我不知道我错过了什么,并且宝石规格文档对此也没有多大的帮助......我不认为宝石名称是绑定到宝石的常量名称,但也许我是错误?你可以重写它吗?还是我错过了别的?

回答

4

这个问题的答案是简单地将此添加到主机中的线路应用程式的Gemfile:gem 'auth_a', path: "../auth_a", require: 'auth'

所以它看起来像它默认为要求,即自动加载的基础上,宝石名称恒定的,而是需要调用告诉它需要什么来代替。

希望它可以帮助别人以及:)