Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails gem规范名称必须等于gem常量名称吗? tl;博士_Ruby On Rails_Rubygems_Ruby On Rails 3.2_Gem_Gemspecs - Fatal编程技术网

Ruby on rails gem规范名称必须等于gem常量名称吗? tl;博士

Ruby on rails gem规范名称必须等于gem常量名称吗? tl;博士,ruby-on-rails,rubygems,ruby-on-rails-3.2,gem,gemspecs,Ruby On Rails,Rubygems,Ruby On Rails 3.2,Gem,Gemspecs,我试图突破一个更大的应用程序的一部分,作为一个可安装的引擎。引擎将以不同的风格存在,每种风格都包含在各自的宝石中。我无法获取gem名称,因为它与引擎常量名称不同 细节 提取的部分包含用于注册、身份验证和会话处理的逻辑。世界各地的客户使用该应用程序,对使用该产品的最终客户有不同的要求和规定。这促使我们为每个监管区域的这些需求创建单独的模块。它们当前位于lib目录中,根据配置加载不同的实现 引擎的目标是装载适当的引擎,路由文件将所有相关调用路由到引擎 因为我们有几个这样的注册模块,还有更多,我们需要

我试图突破一个更大的应用程序的一部分,作为一个可安装的引擎。引擎将以不同的风格存在,每种风格都包含在各自的宝石中。我无法获取gem名称,因为它与引擎常量名称不同

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

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

因为我们有几个这样的注册模块,还有更多,我们需要为变体维护几个gem。我试图使gem具有不同的名称(auth_A、auth_B等),但包含的引擎具有相同的contant名称auth::engine

这样,我们就可以在gem文件中包含正确的gem,其余的就可以了,因为无论运行哪个版本,它应该路由到的端点总是相同的

问题 我遇到的问题是,我无法通过接缝使gem有一个名称,而引擎常数有另一个

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

我的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\u a”
。主机应用程序Gemfile的相关行:
gem'auth\u a',路径:“../auth\u a”


我查看了整个源代码树,试图找到它从gem名称中推断出名称的位置,但我看不到它。我不知道我遗漏了什么,而gem规范文档对此也没有多大帮助。。。我不认为gem的名字和gem的常量名字有联系,但也许我错了?你能覆盖它吗?还是我遗漏了什么?

答案是简单地将它添加到主机应用程序Gemfile中的行:
gem'auth\u a',路径:../auth\u a',require'auth'

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

希望它也能帮助其他人:)