bundle.setup和bundle.require之间的区别是什么

时间:2012-01-19 07:30:59

标签: ruby gem bundle

the gemfile man page开始,我了解到有两种方法导入您在Gemfile中指定的宝石。 bundle.setup将“设置为Ruby的加载路径添加宝石”,而bundle.require将需要所有宝石。

这两种方法有什么区别?我应该在哪种情况下使用其中一种?

3 个答案:

答案 0 :(得分:19)

Bundler.setup修改了LOAD_PATH,因此您可以执行require 'some_gem'之类的操作,它们会起作用。它允许您“手动”需要宝石。在Bundler之前,使用Rubygems,你可以在require 'rubygems'上实现同样的效果。

另一方面,

Bundler.require(:default)实际上需要Gemfile中的所有宝石(假设您没有使用组;否则,如果您提供参数,则需要指定组中的那些宝石)。它是一堆require 'some_gem'语句的简写。

http://gembundler.com/rationale.html。请注意,他们说您必须在执行require 'bundler/setup'之前执行Bundler.require,但实际上这通常不是必需的。我几乎从不使用Bundler.setup(或require 'bundler/setup),因为我需要Bundler.require所有宝石。

答案 1 :(得分:0)

Bundle.setup不是最近捆绑版本的必需品。 事实上,当您运行Bundler.require时,它总是会尝试为您设置正确的$LOAD_PATH

唯一需要的是:

require 'bundler' Bundler.require

答案 2 :(得分:0)

我将在Rails中回答这个问题。我正在查看Rails的初始化过程,并遇到了“ bundler / setup”和Bundler.require。记住Bundler的目标:安装所需的gem,并确保这些是Rails应用程序中唯一需要的gem。这就是Rails的工作方式:

在初始化中,Rails环境首先加载bin / rails的内容。它需要两个重要文件:

require_relative '../config/boot'
require 'rails/commands'

这里的config / boot是最关键的一个。它首先将Gemfile存储在环境变量中,然后运行bundler / setup。

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

我注意到的一件事显然是您可以通过设置环境变量BUNDLE_GEMFILE选择另一个Gemfile使用。但更重要的是,由于“捆绑程序/设置”,$ LOAD_PATH已更改。通常,RubyGems具有默认的$ LOAD_PATH,当您使用“ require”时它将在其中搜索文件。好的,捆绑程序/安装程序会从$ LOAD_PATH中删除所有通往gems的路径(这会逆转RubyGems所做的任何加载路径工作)。然后,它将Gemfile.lock中仅宝石的加载路径添加回$ LOAD_PATH。现在,您唯一需要的文件是Gemfile中的文件。

有趣的是,即使RubyGems具有默认的$ LOAD_PATH(在使用“ require”时进行搜索),您仍然必须使用“ require”。不需要宝石。但是,将Bundler与Rails结合使用时,不需要在Gemfile中需要任何Gems。这是如何完成的?这是由Bundler.require处理的!回到bin / rails文件中,有以下行:

APP_PATH = File.expand_path('../../config/application',  __FILE__)

APP_PATH只是在这里设置。未加载。但是,当您运行Rails Server之类的程序时,将使用APP_PATH并因此将加载config / application.rb文件,从而执行以下操作:

require 'rails/all'
Bundler.require(*Rails.groups)

config / application.rb在Rails引导后运行,在以上内容中,Bundler.require要求您传递给它的所有组中的所有gems。 (“组”是指您在Gemfile中指定的组。)在开发模式下运行Rails时,Rails.groups将为[:default,:development],在生产模式下为[:default,:production],等等。 :default组包括未在任何组下列出的所有宝石。因此,Bundler将在您的Gemfile中查找属于每个组的宝石,并对其找到的每个宝石进行调用。