为什么rubygems代码有特定的文件,只需要具有相同名称的文件,但唯一的区别是它们有snakecase?

omtl5h9j  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(312)

对于我们当前的问题,让我们以回购协议为例。https://github.com/slack-ruby/slack-ruby-client/tree/master/lib
在本回购协议中,我们可以看到以下文件列表。

这个 slack_ruby_client.rb 刚刚 require 'slack-ruby-client' 在文件中。我在其他一些宝石中也看到了类似的惯例。另一个例子是https://github.com/orbit-love/notion-ruby-client/tree/main/lib
这里有逻辑吗?有人能给我解释一下,或者让我看看任何有关这方面的文章吗?

q5iwbnjs

q5iwbnjs1#

首先,gem的默认入口点通常与gem的名称完全相同,因为这遵循bundler的硬编码默认值。在命名gem、ruby文件以及Map到这些文件中的常量(类、模块等)时使用的约定也存在潜在冲突。
首先,在将gem作为依赖项添加到 Gemfile ,bundler可能会尝试自动要求gem。在这里,它默认使用gem依赖项的名称(这可以用 :require 选项)。
正因为如此,系统的正常入口点 slack-ruby-clientnotion-ruby-client 宝石与宝石的名称相同。因此,bundler可以在不需要任何进一步说明的情况下要求gem代码。
现在,除了依赖bundler自动请求之外,还有其他方法需要ruby代码。通常,无论是否使用bundler,开发人员都会手动要求代码以确保其依赖项得到加载。
命名ruby代码文件时,通常的约定是使用以文件中定义的相应类/模块命名的snake_case名称。类名 MySpecialClass 将在名为 my_special_class.rb 鉴于宝石被称为 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和/或其中的文件,从而无缝地提供正确的功能。

3pvhb19x

3pvhb19x2#

因为很多程序员不明白这一点 slack_ruby_clientslack-ruby-client 是不一样的,所以gem的作者提供了这两个文件,以避免充斥着bug报告。
nokogiri的作者也做了同样的事情,因为程序员总是把它拼错 require 'nokogirl' 而不是 require 'nokogiri' 并报告它不起作用的bug,所以nokogiri的作者只是把一个名为 nokogirl.rb 它只包含 require 'nokogiri' .

相关问题