2012-01-19 136 views
10

the gemfile man page,我了解到有两种方法可以导入您在Gemfile中指定的宝石。 bundle.setup将“设置添加宝石到Ruby的加载路径”,而bundle.require将需要所有的宝石。bundle.setup和bundle.require之间有什么区别

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

+0

见http://anti-pattern.com/use-bundler-setup-instead-of-bundler-require和http://myronmars.to/ n/dev-blog/2012/12/5-reasons-to-avoid-bundler-require为什么你应该使用Bundler设置(而不是require),然后手动要求你的依赖关系。 –

回答

19

Bundler.setup修改LOAD_PATH,所以你可以做的事情,如require 'some_gem',他们将工作。它允许你“手工”需要宝石。在Bundler之前,使用Rubygems,您将获得与require 'rubygems'相同的效果。

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

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

+1

如果我理解正确,'Bundler.setup' +一堆'require'语句等于'Bundler.require',对吧? – steveyang

+0

是的,没错。 – Confusion

5

您必须使用Bundle.setup,您可以使用Bundle.require

bundler的要点是要确保Gemfile中定义的Gem对应用程序是可见的,即所有在上述版本中提到的宝石,但不是一个。为此,调整加载路径。这由Bundle.setup完成。

要实际使用这些宝石,它们必须被要求并因此加载到应用程序中。这可以通过使用多个require语句手动完成,也可以使用Bundle.require自动为Gemfile(或仅某些组)中列出的所有宝石完成。但是,只有在如上所述调整加载路径之后才可能。

0

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

唯一需要的是:

require 'bundler' Bundler.require

相关问题