Ruby:自定义 gem 需要其中的模块“要求”
Posted
技术标签:
【中文标题】Ruby:自定义 gem 需要其中的模块“要求”【英文标题】:Ruby: Custom gem demands a 'require' for module therein 【发布时间】:2012-11-28 01:12:04 【问题描述】:我已经构建了一个自定义 Ruby gem。称它为MyGem
,然后文件lib/innermodule.rb
包含:
module MyGem
module InnerModule
def self.foo(); puts "Hello world!"; end
end
end
要从另一个正在开发的 gem 中引用它,我必须这样做:
require 'mygem'
require 'innermodule'
这是正常行为,还是 MyGem
的 gemspec 有问题?
【问题讨论】:
require 'InnerModule' 很奇怪,如果没有名为 InnerModule.rb 的文件(或 .so、.bundle 等用于本地扩展) 感谢您发现 Frederick,这是一个错字。固定。 听起来像是您的 gemspec 的问题 - 您不需要引用内部依赖项 【参考方案1】:我不知道这是否一定是您的 gemspec 的问题,因为您通常只指定要包含在 gem 中的文件。 Gemspecs 与 gem 进入另一个应用程序的方式没有任何关系。
在命名和文件路径约定方面,您的 gem 的构建/打包方式听起来像是一个问题。
构建 gems 和我上面提到的内容通常遵循一些常见的约定
http://guides.rubygems.org/patterns/ 有一个很好的概述。
基本上,您通常希望创建一个位于“lib”目录中的文件(通常是 gem 的名称)。在这种情况下,“lib/mygem.rb”将对 gem 的内部依赖项有单独的要求。
#lib/mygem.rb
require 'innermodule'
然后要将 gem(以及内部模块)包含在任何其他应用程序中,您可以这样做
require 'mygem'
【讨论】:
感谢您提供此信息。我的困惑源于在看到示例后假设需要require 'gem-name'
。但是 gem 本身就包含在内,因此您 require 'class-from-gem'
要求您需要的任何 gem 中的类,如果 gem 的 lib/
目录包含目录 gem-name
,则 require 'dir-name/class'
可能只是看起来包含 gem 名称。正如您在上面所说的,我的 gem 的修复方法就是 require 'innermodule'
从已经导入的 gem 中拉入 innermodule.rb
,然后在代码中引用为 MyGem::InnerModule
。
抱歉,您可能没有看到我的编辑。解决这个问题的最简单方法是让您的“mygem.rb”文件需要它需要运行的任何内部依赖项。这更像是一种“一劳永逸”的思维方式。因此,例如,一旦您在应用中需要“mygem”,您就可以在应用中需要“mygem”的任何类中简单地“包含 MyGem::InnerModule”
我确实看到了你的编辑,别担心。无论如何,谢谢你的解释。我明白你在说什么,但就我而言,InnerModule
实际上是仅供外部使用的东西——我只是在这里为它选择了一个相当糟糕的替代名称:)以上是关于Ruby:自定义 gem 需要其中的模块“要求”的主要内容,如果未能解决你的问题,请参考以下文章
Pundit gem 错误类覆盖我在 ruby 中的自定义错误类
ruby will_paginate(3.0.7)自定义渲染器。注释掉的代码是此版本gem的默认代码。使用`super`作为写的贝尔