使用捆绑EXR耙或只是耙?

我学习Rails只使用rake命令,如rake db:migrate ; 不过,我读到,我应该使用bundle exec rake ...而不是简单的rake 。 现在我很困惑要使用哪个。

我应该使用bundle exec rake而不是简单的rake或者它只是一个偏好的东西? 任何有识之士将不胜感激! 谢谢!

bundle exec在你的bundle的上下文中执行一个命令。

这意味着它使用Gemfile中指定的gem。 很多时候,运行bundle exec rake foo的结果与刚刚运行rake foo结果相同,尤其是如果您在Gemfile中安装了与系统相同的gem。 但是,一些应用程序可能会指定与系统范围内安装的不同版本的gem,并且可能希望那些精确的gem和版本能够正确运行。 如果你只是运行没有bundle exec ,你可能会得到一些奇怪的错误。

使用bundle exec保证程序在gemfile中指定的环境下运行,希望这意味着程序的创build者希望它运行的环境,希望这意味着它应该能够正确运行,无论你使用什么奇怪的设置有你的电脑。

它基本上标准化程序运行的环境。 这有助于避免版本地狱,使生活更容易。

有关更多信息,请参阅http://bundler.io/v1.3/man/bundle-exec.1.html

$ bundle exec rake db:migrate
使用在Gemfile中指定的rake版本来执行rake任务db:migrate

但在Gemfile中没有指定耙gem!
是的,但一个耙gem安装作为一些其他gem的依赖 – 看看Gemfile.lock。 所以规则必须是:使用Gemfile.lock中指定的rake版本。

但是Gemfile.lock没有指定特定的版本 – 它指定了一个比xy更大的版本!
那么规则必须是:使用安装在当前gemset中的rake版本。

$ rake db:migrate
通常,当你在命令行上发出一个命令,比如rake,你的系统会在PATH环境variables中指定的目录列表中search命令。 包含该命令的第一个目录是使用的命令的版本。 要查看哪个目录,你可以这样做:

 $ which rake 

所以如果你执行,

 $ rake db:migrate 

可能会使用与bundle install的不同的rake gem。 但是,即使您的系统发现与bundle exec相同的rake版本,rake源代码所需的任何gem都将在您项目的gemset之外的地方被search到。 因此,有很多方法只是:

 $ rake db:migrate 

可以搞砸了。

根据Ruby on Rails教程手册(免费在线)3.6节,如果您使用的是rvm 1.11.x +,那么您不需要使用bundle exec命令来编写命令。

在没有bundle exec情况下运行任何exacutable将使Rubygems获取系统中安装的最新版本的gem。

通过添加bundle exec前缀代替将运行在Gemfile.lock的上下文中,这意味着将使用在gem文件中定义的版本运行。