【问题标题】:When do you need a require in a rails Gemfile?什么时候需要在 rails Gemfile 中使用 require?
【发布时间】:2014-01-09 19:19:24
【问题描述】:

在我的 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?我还发现了 :require => false 之类的东西。帮忙?

【问题讨论】:

标签: ruby-on-rails ruby bundler gemfile


【解决方案1】:

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

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

表示以下gem语句

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

等价于

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

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

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

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

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

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

require 'library'

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

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

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

另请参阅official Bundler documentation for require

【讨论】:

  • 谢谢!这是一个很好的,详细的答案。非常感谢您的努力。
【解决方案2】:

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

:require => false 禁用 Bundler 的自动要求,因此您需要手动使用 require 'foo' 才能使用 foo 中的代码。如果宝石很大或激活成本很高并且仅在某些情况下使用,这主要是有用的。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      文档说

      每个 gem 可以指定自动请求时应该使用的文件 捆绑器.require。你可以传递一个包含多个文件的数组,或者 false 以防止任何文件被自动要求。

      请参阅this 了解完整文档

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 2012-09-16
        • 1970-01-01
        • 2017-06-17
        • 2015-12-02
        • 2012-10-29
        相关资源
        最近更新 更多