如何在 Ruby on Rails 中创建 gem?(从零开始)
从零开始打造一颗宝石
作为 Web 开发人员,我们都喜欢 Ruby on Rails。我们各有各的理由。但我们喜欢 Ruby on Rails (RoR) 的原因之一是它的简洁性,这简化了我们的编码方式。
Ruby 中最简单的功能之一,也是大多数 RoR 开发人员最喜欢的功能之一,就是创建 Ruby gems。
Ruby 中的 gem 是什么?
Ruby 编程语言中的 gem 是一个软件包,可以将 Ruby 应用程序或库以单一格式分发到其中。
但是,我们的大多数新手网页开发人员都会问这些问题——
为什么要创建一个 gem?它本质上是 Rails 代码,为什么我们不能直接在某个模块文件中添加代码,然后在我们的项目中使用它呢?
对此,答案是肯定的。我们可以使用这种方法。但有时,如果代码看起来比项目特定的代码更通用,则应该将其转换为 gem,以便可以重用并与多个项目共享。这最终将有助于保持代码的简洁性,并减少代码重复。
最近,我们一个项目中需要用到FCM发送通知的功能。Rails中已经存在一个FCM gem来实现这个功能。但是,我们希望集成FCM官方升级后的API,而现有的gem并没有使用这些升级后的API。
那么,我们该如何做到这一点呢?
为了适配新的 API,一种方法是手动编写代码,使用 FCM API 发送通知。但这并非良策,因为大多数项目都会用到“通知”功能。
因此,我们决定创建一个私有 gem,其核心逻辑是使用 FCM 非传统 API 向设备发送通知,这可以进一步用于许多类似的项目中。
接下来,我们将一步一步地学习如何在 Ruby on Rails 中创建 gem。那么,开始吧!
从零开始打造一颗宝石
现在我们开始设置 gem。这里我们将使用 Bundler 创建一个 gem。要使用 Bundler 创建 gem,请使用如下的 bundle gem 命令:
1. 给你的宝石命名:
在运行上述命令之前,我们应该知道如何给 gem 命名。有一些命名约定需要遵循。
- 使用破折号和扩展名(每个破折号代表一个结构(文件夹、模块))
例如,如果我们有一个 gem 名称像gem-structure-demo_notifier这样的 gem。
它将包含在类似require 'gem/structure/demo_notifier' 的某个文件中。
它的类或模块的名称类似于module/class Gem::Structure::DemoNotifier
- 使用下划线(表示类名中的连接符)
例如,如果我们有一个名为demo_notifier 的 gem。
它将包含在类似require 'demo_notifier' 的某个文件中。
它的类或模块的名称将类似于模块/类 DemoNotifier 。
- 不要使用大写字母
我们上面指定的命令将创建以下文件结构,用于创建 gem。
如果这是您第一次运行 bundle gem 命令,系统会询问您是否要将 CODE_OF_CONDUCT.md 和 LICENSE.txt 文件包含在您的项目中。
我们将查看使用 gem bundle 命令生成的所有文件,并对每个文件进行简要描述:
-
Gemfile:此文件用于管理库开发所需的 gem 依赖项。文件中包含 gemspec 行,这意味着 Bundler 将包含 demo_notifier.gemspec 中指定的依赖项。最佳实践是在 gemspec 文件中指定库所依赖的所有 gem。
-
Rakefile:引入 Bundler,并通过调用 Bundler::GemHelper.install_tasks 添加构建、安装和发布 Rake 任务。构建任务将构建当前版本的 gem 并将其存储在 pkg 文件夹下;安装任务将构建 gem 并将其安装到我们的系统中;发布任务会将 gem 推送到 Rubygems 供公众使用。
-
CODE_OF_CONDUCT.md:提供一份行为准则,所有为您的 gem 做出贡献的人都应遵守。只有在您选择包含此文件时,它才会被包含在内。
-
LICENSE.txt:包含 MIT 许可证。只有当您选择包含它时才会包含。
-
demo_notifier.gemspec:Gem 规范文件。我们在此文件中提供 Rubygems 可以使用的信息,例如 gem 的名称、描述和主页。此外,我们还在此文件中指定 gem 运行所需的依赖项。
如您所见,gemspec 文件中存在名为“开发依赖项”的依赖项。那么,这究竟是什么呢?
这是创建 gem 时使用的文件。像 rspec、rake 和 bundler 之类的工具应该包含在此文件中,因为对于将此 gem 添加到其 Gemfile 中的用户来说,这些工具可能并非必需。
在这个文件中,我们还需要包含我们正在创建的 gem 的版本信息。这个版本信息将引用 DemoNotifier 模块的变量 VERSION。
- lib/demo_notifier.rb:定义 gem 代码的主文件,Bundler 会在加载 gem 时引入它。此文件定义了一个模块,我们可以将其用作所有 gem 代码的命名空间。我们在 demo_notifier.rb 文件中添加了向设备发送通知的核心逻辑,如下所示:
-
lib/demo_notifier:此文件夹应包含我们 gem 的所有代码(类等)。lib/demo_notifier.rb 文件用于设置 gem 的环境,而 gem 的所有其他部分都应放在此文件夹中。如果我们的 gem 有多个用途,将其分离出来,以便用户可以一次引入一个类/文件,这将非常有用。
-
lib/demo_notifier/version.rb:定义了一个 demo_notifier 模块,其中包含一个 VERSION 常量。此文件由 demo_notifier.gemspec 加载,用于指定 gem 规范的版本。
gem 的版本控制需要遵循以下一些约定:
-
gem 版本是由三个数字用点分隔的字符串 - 'XXX'。
-
任何一个数字递增都有不同的含义,即表示在发布时对宝石进行的更改级别。
——增加第三个数字,意味着“构建”编号表示更改很小,不会影响 gem 的功能。
——增加第二个数字(次要数字)意味着更改包括添加新功能,但 gem 没有失去与先前版本的兼容性。
——增加第一个数字(主要数字)意味着对 gem 所做的更改非常严重,以至于它不再与以前发布的版本兼容。
2. 测试你的 gem:
现在,在配置完上述所有内容之后,测试编写的代码就非常重要了。
在构建 gem 的过程中,测试 gem 至关重要。它不仅能确保代码正常运行,还能让其他人了解 gem 是否完美运行。对于 Ruby 开发者来说,在选择 gem 时,他们始终会检查一套完善的测试套件,这是他们信任该 gem 并将其集成到应用程序中的主要原因之一。
为了编写测试用例,gem 文件结构还会创建与 rspec 相关的文件,您可以在其中按照 rspec 指南编写测试用例,并通过这些测试用例测试您的代码。在我们的文件结构中,主要的 rspec 测试用例将编写在 ` demo_notifier/specs/demo_notifier_spec.rb`中。
要运行测试用例,您可以运行`rspec`或`bundle exec rspec`。如果结果为绿色,则表示代码运行正常,可以继续执行。
3. 生成构建:
现在我们已经完成了 gem 的编码,希望它能在其他项目中使用。为此,我们将运行构建命令。
此命令将构建 gem 并输出如下 gem 文件:
4. 推动宝石:
最后,宝石构建完成后,就到了推送宝石的时候了。推送宝石有两种方法。
要将 gem 推送到RubyGems,您需要在RubyGems.org 上创建一个帐户。完成后,在推送 gem 时使用您的电子邮件和密码(RubyGems 会将凭据保存在 ~/.gem/credentials 中,因此您只需登录一次)。
之后,只需通过 rubygems.org 将其提供给全球 Rails 社区即可。这可以通过两个简单的命令完成:
完成后,运行以下命令
通过此命令,该 gem 将被推送到 RubyGems 上,并可供使用。
有时我们希望将自己的 gem 代码设为私有,不希望与全世界共享。但 RubyGems 不支持这种做法。
为了确保 gem 的私有性,您可以将 gem 推送到私有的 GitHub 仓库,然后使用包含 OAuth 凭据的 GitHub URL 将该 gem 添加到您的项目中。如果您不想在 URL 中包含 OAuth 凭据,则可以将 SSH 密钥添加到 gem 仓库,并从您安装 gem 的位置获取访问权限。
这样一来,您的宝石就会变成私有的,只有少数人才能访问。
文章来源:https://dev.to/solutelabs/how-to-create-a-gem-in-ruby-on-rails-fromscratch-3f4p