我如何使用另一个 gem 作为依赖项并创建一个从它继承的 class

How do I use another gem as a dependency and create a class that inherits from it

我正在尝试创建一个 gem,它包含一些外部 API 调用,我想使用一个名为 'api-blueprint'[=20= 的 gem ]

我已经添加了对我的 gemspec 文件的依赖 spec.add_runtime_dependency 'api-blueprint'.

现在我想要我的一些 类 继承它

module MyGem
  class Request < ApiBlueprint::Model
    ... code ...
  end
end

我得到一个错误

NameError:
  uninitialized constant MyGem::ApiBlueprint

而且我不确定如何在不将我的 gem 名称附加到名称空间的情况下从依赖项继承。我也尝试过不将其包装在模块中,但我遇到了同样的问题,尽管没有 MyGem 命名空间。

我在 rails 应用程序中使用了这个 gem,使用相同没有问题,但现在我需要将 rails 应用程序中的逻辑重构为 gem.

我还尝试同时要求 api_blueprintapi-blueprint 后者返回此错误

Failure/Error: require "api-blueprint"

ArgumentError:
  wrong number of arguments (given 2, expected 0)

而前者只是返回一个 LoadError。 我不确定这里的问题是什么,除了 gemspec 文件之外,我是否需要包含其他地方?请注意,我也使用 spec.add_dependency 但我遇到了同样的问题。我有点迷路了,这是我第一次去 rubygem

感谢关注:)

And I'm not sure how can I inherit from a dependency without appending my gem name to the namespace.

你不需要那样做。您只是被误导性的错误消息弄糊涂了。

在 ruby 中,首先尝试在模块内部进行常量查找,然后 然后 在全局命名空间中进行查找。

换句话说,这段代码:

module MyGem
  class Request < ApiBlueprint::Model

首先尝试找到常量:MyGem::ApiBlueprint::Model,并且(如果失败),它然后尝试找到常量:ApiBlueprint::Model。如果同样失败,它会使用第一条错误消息,这就是您所看到的。

为了防止出现令人困惑的错误消息(尽管仅此并不能解决实际问题!!),您可以明确告诉解释器 在全局命名空间:

module MyGem
  class Request < ::ApiBlueprint::Model

Failure/Error: require "api-blueprint"

ArgumentError:
  wrong number of arguments (given 2, expected 0)

您需要为我们提供有关该错误的更多背景信息。什么是堆栈跟踪?使用 2 个参数而不是 0 个参数调用什么方法?

据我所知,添加此 require 语句 应该 就是您需要做的全部。