使用bundle exec rake还是只是rake?


81

我只使用了rake命令就学会了Rails rake db:migrate;但是,我读到我应该使用bundle exec rake ...而不是plain rake。现在我对使用哪个感到困惑。

我应该使用bundle exec rake而不是简单使用rake还是仅仅是偏爱?任何见解将不胜感激!谢谢!

Answers:


126

bundle exec 在包的上下文中执行命令。

这意味着它将使用您的Gemfile中指定的gem。在大多数情况下,运行bundle exec rake foo与刚运行时具有相同的结果rake foo,尤其是如果您在系统范围内安装了与Gemfile中相同的gem。但是,某些应用程序可能指定的gem版本与您在系统范围内安装的gem版本不同,并且可能希望这些确切的gem和版本能够正确运行。如果不使用bundle exec,可能会出现一些奇怪的错误。

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

它从根本上标准化了程序运行的环境。这有助于避免版本地狱,并使生活更加轻松。

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


4
如果您一直不厌倦地键入bundle exec,则可以配置rvm,因此不必这样做:ruby.railstutorial.org/chapters/…–
Lance Fisher

1
注意:Bundle手册页已更改,截至此日期,正确的是:bundler.io/v1.3/man/bundle-exec.1.html
Americo Savinon 2013年

1
使用的一个很好的副作用bundle exec是,它还会告诉您是否应该运行bundle install以安装与Gemfile.lock文件相比丢失的gem版本。
杰伊·米切尔

您已经很好地解释了..谢谢。
奥雅纳(Arup Rakshit)2015年

5

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

但是在Gemfile中没有指定rake gem!
是的,但安装了rake gem作为其他gem的依赖项-在Gemfile.lock中查找。因此,规则必须是:使用Gemfile.lock中指定的rake版本。

但是Gemfile.lock没有指定特定版本,而是指定了大于xy的版本!
然后,规则必须为:使用当前gemset中安装的rake的版本。

$ rake db:migrate
通常,当您在命令行上发出命令(例如rake)时,系统会在PATH环境变量中指定的目录列表中搜索该命令。包含该命令的第一个目录是所使用命令的版本。要查看哪个目录,可以执行以下操作:

$ which rake

所以如果执行

$ rake db:migrate

可能会使用不同的宝石耙比你安装了一个bundle install。但是,即使您的系统找到与相同的rake版本bundle exec,也将在项目的gemset之外的位置搜索rake源代码所需的任何gem。因此,有很多方法可以实现:

$ rake db:migrate

会搞砸

根据Ruby on Rails教程手册(免费在线)的第3.6节,如果您使用的是rvm 1.11.x +,则无需在命令前加上bundle exec


1

如果不运行任何可执行文件,bundle execRubygems将获取安装在系统中的gem的最新版本。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.