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任务。