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 需要其中的模块“要求”的主要内容,如果未能解决你的问题,请参考以下文章

在自定义构建的gem中获取ruby gem依赖项的错误

Pundit gem 错误类覆盖我在 ruby​​ 中的自定义错误类

ruby will_paginate(3.0.7)自定义渲染器。注释掉的代码是此版本gem的默认代码。使用`super`作为写的贝尔

无法在 gem Devise 中调整控制器,ruby on rails 4

Ruby 中嵌套复杂对象的自定义 to_json

Mac OS 下Ruby gem的一些坑