在我见过的几乎所有Sinatra例子中,尽管它做了什么,它总是有以下两行:
require 'rubygems'
require 'bundler/setup'
在大多数示例中,删除'bundler / setup'需要似乎没有破坏效果,所以我很困惑何时/何时需要包含它。
我讨厌使用的东西而不确切知道它存在的原因,所以我希望有人可以解释为什么我需要这两条线以及它们做什么?
答案 0 :(得分:15)
它确保您加载Gemfile定义的gem。请查看此处的文档https://bundler.io/v1.12/bundler_setup.html
答案 1 :(得分:6)
有一个实际的解释:
假设我们想从github master分支使用名为pristine_text的gem
的Gemfile:
gem "pristine_text", github: "nurettin/pristine_text"
main.rb :(错误)
require "pristine_text"
# error, can't find pristine_text
要求找不到它,因为宝石不在ruby可以看到的路径中。如果你看一下gem的实际路径,你会看到它在
之下 /pristine-text-some_commit_id
main.rb :(右)
require "bundler/setup"
require "pristine_text"
# no error
错误消失了,因为现在您使用依赖项的加载路径加载bundler。
答案 2 :(得分:4)
Bundle安装程序“清除”加载路径,因此后续尝试要求不在Gemfile中的内容将导致加载错误。
答案 3 :(得分:4)
Brian Storti wrote the best article I can find on Bundler setup - from which the quote is taken。
了解正在发生的事情
简而言之,Bundler正在做的是从$ LOAD_PATH中删除未在Gemfile中定义的所有内容。 $ LOAD_PATH(或者只是$ :)是一个全局变量,它告诉Ruby它应该在哪里查找所需的东西,所以如果一个依赖项不在Gemfile中,它就不会在$ LOAD_PATH中,然后Ruby有无法找到它。
显示代码
This是我们需要'bundler / setup'时加载的文件,重要的是Bundler.setup调用。此设置首先cleans the load path,然后activates只是Gemfile中定义的宝石,这基本上意味着adding them to the $LOAD_PATH variable。
注意:我已经更新了“显示代码”链接,因为它们已转到已更改的主分支。