什么时候需要在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以防止任何文件被自动获取。
有关整个文档,请参阅此处