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