对于我们当前的问题,让我们以回购协议为例。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
这里有逻辑吗?有人能给我解释一下,或者让我看看任何有关这方面的文章吗?
2条答案
按热度按时间q5iwbnjs1#
首先,gem的默认入口点通常与gem的名称完全相同,因为这遵循bundler的硬编码默认值。在命名gem、ruby文件以及Map到这些文件中的常量(类、模块等)时使用的约定也存在潜在冲突。
首先,在将gem作为依赖项添加到
Gemfile
,bundler可能会尝试自动要求gem。在这里,它默认使用gem依赖项的名称(这可以用:require
选项)。正因为如此,系统的正常入口点
slack-ruby-client
及notion-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和/或其中的文件,从而无缝地提供正确的功能。
3pvhb19x2#
因为很多程序员不明白这一点
slack_ruby_client
及slack-ruby-client
是不一样的,所以gem的作者提供了这两个文件,以避免充斥着bug报告。nokogiri的作者也做了同样的事情,因为程序员总是把它拼错
require 'nokogirl'
而不是require 'nokogiri'
并报告它不起作用的bug,所以nokogiri的作者只是把一个名为nokogirl.rb
它只包含require 'nokogiri'
.