为什么 Ruby Gems 代码有某些文件只需要同名文件,但唯一的区别是它们有 snakecase?

Why the Ruby Gems code have certain file that just requires file with same name but the only difference is they have snakecase?

对于我们当前的问题,让我们以这个 repo 为例。 https://github.com/slack-ruby/slack-ruby-client/tree/master/lib

在这个 repo 中,我们可以看到以下文件列表。

slack_ruby_client.rb 文件中只有 require 'slack-ruby-client'。我在其他一些宝石中也看到了类似的约定。另一个例子是 https://github.com/orbit-love/notion-ruby-client/tree/main/lib

这里面有逻辑吗?有人可以向我解释一下或指导我阅读任何讨论此问题的文章吗?

因为很多程序员不明白 slack_ruby_clientslack-ruby-client 不是一回事,所以 gem 的作者提供了这两个文件以避免被淹没有错误报告。

Nokogiri 的作者做了同样的事情,因为程序员一直将它拼错为 require 'nokogirl' 而不是 require 'nokogiri' 并报告它不起作用的错误,所以 Nokogiri 的作者只是把名为 nokogirl.rb 的文件仅包含 require 'nokogiri'.

首先,gem 的默认入口点通常是与 gem 的名称完全相同的文件,因为这遵循捆绑程序的硬编码默认值。在命名 gems、ruby 文件和映射到这些文件中的常量(classes、模块等)时,也存在潜在的约定冲突。

首先,当添加 gem 作为 Gemfile 的依赖项时,捆绑器可能会尝试自动要求 gem。在这里,它默认使用 gem 依赖项的名称(可以使用 :require 选项覆盖)。

因此,slack-ruby-clientnotion-ruby-client gem 的正常入口点与 gem 的名称相同。因此,Bundler 无需任何进一步说明即可要求 gem 代码。

现在,除了依赖捆绑程序自动请求之外,还有其他方法可以要求 Ruby 代码。通常,开发人员手动要求代码来确保他们的依赖项被保证加载,无论是否使用 bundler。

命名 ruby 代码文件时的通常惯例是使用 snake_case 以文件中定义的相应 class / 模块命名的名称。 class 名称 MySpecialClass 将在名为 my_special_class.rb

的文件中定义

鉴于 gem 被称为 slack-ruby-client 并且人们知道这个特定名称,因此他们可能会认为他们可以或应该要求 gem 作为 require "slack_ruby_client",假设此处使用 snake_case 文件名(在 Ruby 中的大多数情况下都是如此)。 slack-ruby-client gem 通过提供一个适当命名的文件来加载实际模块来支持这个假设。

此外,当手动请求代码时,许多人认为他们可以使用转换为 snake_case 的模块名称来请求所需的模块。在 slack-ruby-client 提供 Slack 模块的情况下,人们可能会因此假设他们可以只使用 require "slack" 来加载模块。

因此,gem 还提供了一个名为 slack.rb 的文件,该文件需要 gem.

的实际入口点

最后,这些文件是由 gem 作者添加的,目的是为人们提供方便的入口点,这些人假设使用各种约定命名 gems 和/或其中的文件,以便提供正确的功能无缝。