bundle exec rake是什么意思?

bundle exec rake db:migrate是什么意思? 或者只是一般bundle exec rake <command>

我明白, bundle照顾维护Gemfile中的东西。 我知道“exec”这个词的意思。 我明白, rake保持所有不同的脚本你可以做的事情,我知道db:migrate是其中之一。 我只是不知道这些词汇在一起做什么。 为什么应该使用bundle执行rake来执行数据库迁移?

bundle exec是Bundler命令,用于在当前包(来自目录的Gemfile的包 )中执行脚本。 rake db:migrate是脚本,其中db是命名空间, migrate是定义的任务名称。

所以bundle exec rake db:migrate用当前包的上下文中的命令bundle exec rake db:migrate执行rake脚本。

至于“为什么?” 我将从打包商页面引用:

在某些情况下,如果可执行文件恰好安装在您的系统中,并且没有引入与您的软件包相冲突的任何gem,那么在没有bundle exec情况下运行可执行文件可能会有效。

然而,这是不可靠的,是相当大的痛苦的来源。 即使看起来有效,也可能在将来或其他机器上无法正常工作。

你正在一个程序上运行bundle exec 。 该程序的创作者在某些版本的gem可用时编写了它。 程序Gemfile指定了创build者决定使用的gem的版本。 也就是说,这个脚本是针对这些gem版本正确运行的。

您的系统级Gemfile可能与此Gemfile不同。 你可能会有更新或更老的gem,与此脚本不好玩。 版本中的这种差异会给你奇怪的错误。

Bundle exec可以帮助您避免这些错误。 它使用脚本的Gemfile中指定的gems而不是全系统的Gemfile来执行脚本。 它用shell别名的魔法执行某些gem版本。

在手册页上查看更多信息。

这里是一个Gemfile的例子:

 source 'http://rubygems.org' gem 'rails', '2.8.3' 

在这里, bundle exec将使用Rails 2.8.3版来执行脚本,而不是你可能已经安装在系统范围内的其他版本。

当你的gemfile.lock在你的机器上安装了不同版本的gem时,会出现很多问题。 在运行rake(或rspec或其他)之后,您可能会收到警告,例如:

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

无论版本差异如何,预先configurationbundle exec通知捆绑器执行此命令。 然而,并不总是有问题,你可能会遇到问题。

幸运的是,有一个解决这个问题的gem:rubygems-bundler。

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

然后尝试你的耙,rspec,或者其他什么。

应该提到的是,有些方法可以忽略bundle exec (在Michael Hartls的Ruby on Rails教程手册的3.6.1章节中都有说明)。

最简单的方法就是使用足够最新版本的RVM(> = 1.11.x)。

如果您仅限于早期版本的RVM,则始终可以使用calasyr提到的这种方法:

 $ rvm get head && rvm reload $ chmod +x $rvm_path/hooks/after_cd_bundler $ bundle install --binstubs=./bundler_stubs 

bundler_stubs目录也应该被添加到.gitignore文件中。

第三种方法是在不使用RVM的情况下使用rubygems-bundler gem:

 $ gem install rubygems-bundler $ gem regenerate_binstubs 

我没有使用bundle exec,但现在正在设置它。

我曾经遇到过使用错误耙子的情况,并且浪费了很多时间来追踪这个问题。 这有助于避免这种情况。

以下是如何设置rvm,以便您可以在特定项目目录中默认使用bundle exec:

http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs

这意味着使用rake bundler知道,并且是你的Gemfile的一部分,而不是捆绑者不知道的rake,然后运行db:migrate任务。