从 Rails 类 创建 Ruby Gem 以在 Sinatra 中使用

Create Ruby Gem from Rails classes to use in Sinatra

我正在尝试从 Rails 应用程序中提取几个 类 到它自己的 Gem 中,以便我可以重用 Sinatra 应用程序中的代码。

在 Rails 应用程序中,我有以下结构:

app > classes > api > (bunch of folders and subfiles)

我正在尝试将 api 文件夹移动到 gem,为此我使用捆绑器创建了一个新的 gem:

bundle gem myapp-core --no-exe --no-coc --no-mit --no-ext

所以我最终得到了这样的文件结构:

myapp-core > lib > myapp > core > version.rb
myapp-core > lib > myapp > core.rb

我已将 api 文件夹复制到 myapp-core > lib > myapp > api 并尝试从 sinatra 中 require 执行以下操作:

require 'myapp/api/somefile.rb'

但这没有用,我当然已经将 gem 添加到 sinatra 应用程序的 Gem 文件中。 我尝试了将文件夹放在哪里以及如何在其中获取文件的各种组合,但我得到 cannot load such fileuninitialized constant Api (NameError).

正确的方法是什么,以便理想地从 Sinatra 和 Rails 我将 gem 添加到 Gem 文件,需要我需要的任何文件使用这些 API 文件的代码将保持不变还是尽可能少地更改?

如果没有 Rails 自动加载器,您将需要自己建立所有中间 class 和模块组件。

这通常意味着您需要声明如下内容:

module Api
  class Somefile
    # ...
  end
end

自动声明 Api 模块的地方,允许您直接要求 lib/api/somefile,或者您需要将此责任转移到链上:

# lib/api.rb
module Api
  # ...
end

require_relative './api/somefile'

在任何依赖项中自动加载的地方,你现在做 require 'api',假设你的 $LOAD_PATH 包含这个特定的 lib/ 路径。