如何解决为什么 Ruby Gems 代码有某些文件只需要同名的文件,但唯一的区别是它们有蛇形外壳?
对于我们当前的问题,让我们以这个 repo 为例。 https://github.com/slack-ruby/slack-ruby-client/tree/master/lib
slack_ruby_client.rb
文件中只有 require 'slack-ruby-client'
。我在其他一些 gem 中也看到了类似的约定。另一个例子是https://github.com/orbit-love/notion-ruby-client/tree/main/lib
这里有什么逻辑吗?有人可以向我解释一下或指导我阅读任何讨论此问题的文章吗?
解决方法
因为很多程序员不明白 slack_ruby_client
和 slack-ruby-client
不是一回事,所以 gem 的作者提供了这两个文件以避免被错误报告淹没。>
Nokogiri 的作者做了同样的事情,因为程序员一直将它拼错为 require 'nokogirl'
而不是 require 'nokogiri'
并报告它不起作用的错误,所以 Nokogiri 作者只是将一个名为nokogirl.rb
只包含 require 'nokogiri'
。
起初,gem 的默认入口点通常是与 gem 名称完全相同的文件,因为这遵循了 bundler 的硬编码默认值。命名 gems、ruby 文件以及映射到这些文件中的常量(类、模块等)时使用的约定也存在潜在冲突。
起初,当将 gem 作为依赖项添加到您的 Gemfile
时,bundler 可能会尝试自动请求 gem。在这里,它默认使用 gem 依赖项的名称(这可以用 :require
选项覆盖)。
因此,slack-ruby-client
和 notion-ruby-client
gem 的正常入口点的名称与 gem 相同。因此,Bundler 无需任何进一步说明即可要求 gem 代码。
现在,除了依赖打包器自动要求之外,还有其他方式需要 Ruby 代码。通常,开发人员手动需要代码来确保他们的依赖项都被加载,无论是否使用 bundler。
命名 ruby 代码文件时的通常约定是使用以文件中定义的相应类/模块命名的 snake_case 名称。类名 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 作者添加的,目的是为人们假设命名 gem 和/或其中的文件的各种约定提供便利的入口点,以便无缝地提供正确的功能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。