ChatGPT解决这个技术问题 Extra ChatGPT

Ruby:Gemfile 中的“require:false”是什么意思?

做这个:

gem 'whenever', require: false

意味着需要安装gem,还是不需要安装gem?

据我了解,大多数答案(包括接受的答案)都是关于默认执行 Bundler.require 的 Rails。只有 Ciro 和 Nesha 的答案是正确的。

s
sawa

这意味着安装 gem,但在启动 Bundler 时不要调用 require。所以你需要手动调用

require "whenever"

如果你想使用图书馆。

如果你要做

gem "whenever", require: "whereever"

然后 bundler 会随时下载命名的 gem,但会调用

require "whereever"

如果需要的库名称与 gem 的名称不同,则通常使用此方法。


@VenkatD。有时您想安装某些 gem,但又不想将它们加载到每个进程中。我有一个特定的 rake 任务,我想通过 Heroku 的计划插件定期调用它。这个特殊的 rake 任务需要应用程序的其余部分不需要的某些 gem。因此,我从 rake 任务中:require => false这些特定的宝石并明确地require "thegem"。这将在主应用程序进程和启动时间等中节省内存。但是,即使您在每个进程中都需要这些额外的 gem,应用程序性能也不应该受到影响。
@MichaelvanRooijen - 但是很重要:“但是,即使您在每个过程中都需要这些额外的宝石,应用程序的性能也不应该受到影响”。我不认为那是真的。根据 confreaks.com/videos/2668-gogaruco2013-measuring-ruby,分配对象需要工作,并且 GC 每次都必须运行所有这些对象,因此更多 = 更慢
@MichaelvanRooijen - 实际上,您是对的,除非您使用该库,否则这通常无关紧要。但是需要一个 gem 至少会在 lib 中加载它的主文件,并且可能它自己需要更多。即使您是 require 'yaml',您现在也将 YAML 模块作为内存中的一个对象。
如果您想将 require 设置为 false 并且库名称也与 gem 名称不同怎么办?
@Peter-JanCelis 在这种情况下,您只需设置 :require => false ,然后在您的代码中有一个 require 'library_name_here'
g
gduq

当您希望安装 gem 但不是“必需的”时使用 :require => false

因此,在您给出的示例中:gem 'whenever', :require => false 当有人运行 bundle install 时,gem 将与 gem install whenever 一样安装。 When 用于通过运行 rake 任务来创建 cron 作业,但通常不在 rails(或其他框架,如果不是 rails)应用程序中使用。

因此,您可以将 :require => false 用于需要从命令行运行但在代码中不需要的任何内容。


这也可以用于只在一小部分请求中使用的 gem。
C
Ciro Santilli Путлер Капут 六四事

require: false 告诉 Bundler.require 不要要求特定的 gem:必须通过 require 'gem' 明确要求 gem。

此选项不影响:

捆绑安装:无论如何都会安装gem

bundler 设置的需要搜索路径。当您执行以下任一操作时,Bundler 会将内容添加到路径中: Bundle.setup 由 require 调用 bundler/setup 由 bundle exec 调用

Bundle.setup

由 require bundler/setup 调用

由 bundle exec 调用

例子

宝石文件

source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false

主文件

# Fail because we haven't done Bundler.require yet.
# bundle exec does not automatically require anything for us,
# it only puts them in the require path.
begin Haml; rescue NameError; else raise; end
begin Faker; rescue NameError; else raise; end

# The Bundler object is automatically required on `bundle exec`.
Bundler.require

Haml
# Not required because of the require: false on the Gemfile.
# THIS is what `require: false` does.
begin Faker; rescue NameError; else raise; end

# Faker is in the path because Bundle.setup is done automatically
# when we use `bundle exec`. This is not affected by `require: false`.
require 'faker'
Faker

那么以下不会引发异常:

bundle install --path=.bundle
bundle exec ruby main.rb

On GitHub 供您使用。

导轨使用

initialization tutorial 中所述,默认的 Rails 模板在启动时运行:

配置/boot.rb

配置/应用程序.rb

config/boot.rb 包含:

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

它执行 require 'bundler/setup' 并设置所需路径。

config/application.rb 会:

Bundler.require(:default, Rails.env)

这实际上需要宝石。


请注意,使用 require 'faker 可能不会使用正确的 gem 版本,特别是如果您的 Gemfile 指向 git ref。
@dazonic 在这个例子中 Haml 有什么不同吗?
S
Subhash Chandra

每当您在 Gemfile 中指定 Gem 并运行 bundle install 时,bundler 都会安装指定的 gem 并在您的应用程序中加载该 Gem 的代码,方法是这样放置 require 'whenever',bundler 将为您的所有 Gem 加载代码Rails 应用程序,您可以从任何 Gem 调用任何方法,而无需任何痛苦,就像您大多数时候所做的那样。

但是像 whenever, faker or capistrano 这样的 Gem 是您的应用程序代码中不需要的东西,只要您的 schedule.rb 文件中的代码用于管理 deploy.rb 文件中的 crons 和 capistrano 代码以自定义部署配方,因此您无需加载代码这些 gem 在您的应用程序代码中以及您想从这些 Gem 调用任何方法的任何位置,您都可以通过放置 require "whenever" 手动手动要求这些 gem。因此,您将 :require => false 放入这些 Gem 的 Gemfile 中,这样捆绑程序将安装该 Gem,但不加载该 Gem 本身的代码,您可以随时通过简单地在您的情况下输入 like require 'whenever' 来执行此操作。


N
Nesha Zoric

为了在您的 Gemfile 中需要 gem,您需要调用 Bundler.require

您可以使用 require: false 阻止 bundler 需要 gem,但它仍会安装和维护 gem。查看 this out 以获得更详细的说明。


B
BenKoshy

类比解释

## Gemfile
gem "university_degree", require: false
gem "dealing_with_boss"

“dealing_with_boss” - 始终需要 - 加载到内存中并准备就绪。

我很少需要学位宝石。只有当我与招聘人员交谈时。所以我手动要求它,突然之间像“Black Scholes-Merton”和“heteroskadasticity”这样的花哨的词立即加载到内存中;我告诉招聘人员我可以进行复杂的排序算法:例如,三种不同语言的“冒泡排序”:Javascript、EcmaScript 和 ES16——看看我有多聪明——这通常足以让我与其他人交谈。