Ruby 你为什么需要“你需要什么?”;要求';捆扎机/设置'&引用;?

Ruby 你为什么需要“你需要什么?”;要求';捆扎机/设置'&引用;?,ruby,bundler,Ruby,Bundler,在我所看到的几乎每一个Sinatra示例中,不管它做了什么,它总是有以下两行: require 'rubygems' require 'bundler/setup' 在大多数示例中,删除“bundler/setup”要求似乎没有破坏效果,因此我不知道何时/何地需要包含此内容 我讨厌在不知道它存在的确切原因的情况下使用东西,所以我希望有人能解释我为什么需要这两行以及它们的作用?它确保您加载的是Gemfile定义的gems。请查看此处的文档捆绑包设置会“清除”加载路径,因此随后尝试要求Gemfil

在我所看到的几乎每一个Sinatra示例中,不管它做了什么,它总是有以下两行:

require 'rubygems'
require 'bundler/setup'
在大多数示例中,删除“bundler/setup”要求似乎没有破坏效果,因此我不知道何时/何地需要包含此内容


我讨厌在不知道它存在的确切原因的情况下使用东西,所以我希望有人能解释我为什么需要这两行以及它们的作用?

它确保您加载的是Gemfile定义的gems。请查看此处的文档

捆绑包设置会“清除”加载路径,因此随后尝试要求Gemfile中没有的内容将导致加载错误。

有一个实用的解释:

假设我们想使用github主分支中名为pristine_text的gem

档案:

gem "pristine_text", github: "nurettin/pristine_text"
main.rb:(错)

require无法找到它,因为gem不在ruby可以看到的路径中。如果你看一看宝石的实际路径,你会发现它在下面

/pristine-text-some\u commit\u id

main.rb:(右)

错误消失了,因为现在您使用依赖项的加载路径加载bundler

了解正在发生的事情 简而言之,Bundler所做的是从$LOAD_路径中删除文件中未定义的所有内容。$LOAD_PATH(或仅仅是$:)是一个全局变量,它告诉Ruby应该在哪里查找所需的内容,因此如果依赖项不在GEM文件中,它就不会在$LOAD_路径中,Ruby就无法找到它

放码过来。 是我们需要“bundler/setup”时加载的文件,这里最重要的是调用。首先是这个设置,然后是gem文件中定义的gem,这基本上意味着


注意:我已经更新了“向我显示代码”链接,因为它们转到了已更改的主分支。

显然它不符合GEM_HOME或GEM_PATH环境变量?因此,如果您包括
require“bundler/setup”
,启动脚本时是否不必使用
bundle exec
?是的,没错。通过包含
require“bundler/setup”
您在启动脚本时不需要使用
bundle exec
。但是require“bundler”和require“bundler/setup”之间的区别是什么?有关更好的用法示例,请参阅,所有答案都会告诉您原因。但是,当您使用除“”以外的URL时,您知道gems安装在何处吗?在gems/version/directory中查找bundler文件夹,而不是gem本身。它将有一个文件夹,上面写着gems,当bundler安装gems而不是rubygems source时,它们就会出现在那里。你甚至可以告诉bundler在哪里安装它们,就像在你的应用程序中的供应商文件夹一样,然后从那里加载它们。看见
require "pristine_text"
# error, can't find pristine_text
require "bundler/setup"
require "pristine_text"
# no error