2011-11-26 56 views
69

我学习了Rails,只使用了像rake db:migrate这样的rake命令;然而,我读到我应该使用bundle exec rake ...而不是简单的rake。现在我对使用哪一个感到困惑。使用bundle exec rake或只是耙?

我应该使用bundle exec rake而不是简单的rake还是只是一个偏好的事情?任何有识之士将非常感谢!谢谢!

回答

101

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

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

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

它基本上标准化程序运行的环境。这有助于避免版本问题,让生活变得更轻松。

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

+4

如果您厌倦了随时键入bundle exec,则可以配置rvm,因此它不是必需的:http://ruby.railstutorial.org/chapters/static-pages#sec:eliminating_bundle_exec –

+1

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

+1

使用'bundle exec'的一个很好的副作用是它也会告诉你如果您应该运行'bundle install'来安装与Gemfile.lock文件相比缺少的宝石版本。 –

1

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

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

4

$捆绑高管耙分贝:迁移
使用在指定的Gemfile执行rake任务db:migrate耙的版本。

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

但是Gemfile.lock没有指定特定版本 - 它指定了一个大于x.y的版本!
然后,规则必须是:使用安装在当前gemset中的rake版本。

$耙分贝:迁移
通常,当你在命令行上发出命令,例如rake,系统会在您的PATH环境变量中指定的目录列表中搜索命令。包含该命令的第一个目录是所用命令的版本。要查看哪些目录,你可以这样做:

$ which rake 

所以,如果你执行,

$ rake db:migrate 

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

$ rake db:migrate 

可以搞砸了。

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

+0

不错,谢谢 –

相关问题