使用捆绑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文件中定义的版本运行。