什么时候需要在rails Gemfile中使用require?

在我的gemfile中,我有类似的东西:

gem 'net-sftp', '2.1.1', :require => 'net/sftp' gem 'backup', '3.0.27' gem 'watu_table_builder', :require => 'table_builder' gem 'browser', '0.1.6' 

在Gemfile中你需要一个需求吗? 我还发现了类似:require => false 。 救命?

如果省略:require选项,默认情况下Bundler将尝试使用标准的名称到文件转换规则来要求gem:

破折号被视为命名空间分隔符和下划线类名分隔符

它表示以下gem语句

 gem 'net-sftp' gem 'backup' gem 'foo_bar' 

相当于

 gem 'net-sftp', require: 'net/ftp' gem 'backup', require: 'backup' gem 'foo_bar', require: 'foo_bar' 

如果gem作者遵循标准约定,这种方法很有效。 但在某些情况下,由于各种原因,这种情况不会发生。

例如,有一些名为foo-bar gem,主文件名是/foo_bar.rb ,甚至是/foo.rb 。 在这种情况下,您提供:require选项以告诉Bundler您需要哪个文件。

最后,当您希望gem成为bundle的一部分时,使用require: false ,但是您不希望Bundler默认加载它。

例如,这对于延迟加载gem是有用的,以防它仅在某些情况下使用。 考虑一个包含重gem的rake任务。 您不希望应用程序在启动时加载它,但它必须是捆绑包的一部分,否则将无法找到它。

在这种情况下,您传递选项require: false 。 然后,在您的rake任务中,您将像往常一样手动使用它

 require 'library' 

只有在调用任务时才会加载库,而不是在正常的应用程序执行中加载。

一个很好的例子就是。 该库必须是bundler的一部分,因为它必须在部署应用程序时捆绑,但它应作为命令行脚本运行。 因此,在启动Rails应用程序时,您不希望Bundler需要它。

在某些情况下,您使用组而不是require: false

另请参阅有关require的官方Bundler文档 。

如果无法从gem的名称推断出激活gem所需的文件名,则需要:require 。 Ruby约定是将gem命名为应该使用的“require”语句 ,但并非所有内容都遵循约定。

:require => false禁用Bundler自动要求,因此您需要手动使用require 'foo'来使用foo的代码。 如果gem很大或昂贵而且仅在某些情况下使用,这主要是有用的。

如果要求的库的名称与gem的名称不同,则通常使用此方法。 在你的情况下,它会下载gem 'watu_table_builder' ,但会调用'table_builder'

require指定在需要此特定gem时require其他文件。

文档说

每个gem都可以指定在通过Bundler.require自动获取时应该使用的文件。 您可以传递包含多个文件的数组,也可以传递false以防止任何文件被自动获取。

有关整个文档,请参阅此处