bundle exec rake db:migrate
是什么意思? 还是一般只bundle exec rake <command>
?
我知道bundle
负责维护Gemfile中的内容。 我知道“ exec”一词的含义。 我了解到rake
保留了您可以执行的所有不同脚本操作,并且我知道db:migrate
是其中之一。 我只是不知道所有这些词在一起是做什么的。 为什么应使用bundle
执行rake
来执行数据库迁移?
#1楼
我没有太多使用bundle exec
,但是现在进行设置。
我曾经遇到过使用错误的耙子的情况,而浪费大量时间来查找问题。 这可以帮助您避免这种情况。
设置RVM的方法如下,默认情况下,您可以在特定项目目录中使用bundle exec
:
https://thoughtbot.com/blog/use-bundlers-binstubs
#2楼
您正在程序上运行bundle exec
。 该程序的创建者在某些版本的宝石可用时就编写了该程序。 程序Gemfile指定创建者决定使用的gem的版本。 也就是说,脚本已针对这些gem版本正确运行。
您系统范围的Gemfile可能与此Gemfile不同。 您可能拥有较新或较旧的gem,但此脚本无法很好地发挥作用。 版本上的这种差异可能会给您带来怪异的错误。
bundle exec
可以帮助您避免这些错误。 它使用脚本的Gemfile(而不是系统范围的Gemfile)中指定的gem执行脚本。 它使用Shell别名的魔术来执行某些gem版本。
有关更多信息,请参见手册页 。
这是一个示例Gemfile:
source 'http://rubygems.org'
gem 'rails', '2.8.3'
在这里, bundle exec
将使用2.8.3的Rails版本执行脚本,而不是在系统范围内安装的其他版本。
#3楼
可能应该提到的是,有一些方法可以省略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
#4楼
当您的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.
前面的bundle exec
告诉捆绑程序执行此命令,而不考虑版本差异。 并不总是有问题,但是,您可能会遇到问题。
幸运的是,有一个宝石可以解决这个问题:rubygems-bundler。
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
然后再尝试使用rake,rspec或其他方法。
#5楼
当您直接运行rake任务或执行gem的任何二进制文件时,无法保证该命令的行为符合预期。 因为可能已经在系统上安装了相同的gem,版本为1.0,但在项目中却具有较高的版本,例如2.0。 在这种情况下,您无法预测将使用哪一个。
要强制执行所需的gem版本,请使用bundle exec
命令的帮助,该命令将在当前bundle的上下文中执行二进制文件。 这意味着,当您使用bundle exec时,bundler会检查为当前项目配置的gem版本,并使用它来执行任务。
我也写了一篇关于它的文章 ,它也显示了如何避免使用bin存根使用它。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3185165