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

时间:2014-01-09 19:19:25

标签: ruby-on-rails ruby bundler gemfile

在我的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这样的东西。帮助

4 个答案:

答案 0 :(得分:12)

如果省略:require选项,默认情况下,Bundler将尝试使用标准的名称到文件转换规则来要求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'

如果宝石作者遵循标准惯例,这种方法很有效。但在某些情况下,出于各种原因,这种情况不会发生。

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

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

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

在这种情况下,您传递选项require: false。然后,在您的rake任务中,您将照常需要手动

require 'library'

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

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

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

另请参阅official Bundler documentation for require

答案 1 :(得分:1)

如果无法从gem的名称推断出激活gem所需的文件名,则需要:require。 Ruby约定是name your gem the same thing as the "require" statement you should use,但并非一切都遵循惯例。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

文档说

  

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

有关完整文档,请参阅this