它是做什么的“捆绑exec rake db:migrate”?

根据我的研究,bundle exec负责在bundle的上下文中执行命令。

无论如何,我还不太明白它对于命令rake db:migrate什么不同rake db:migratebundle exec rake db:migrate

例如在我的情况下,我执行了第一个命令,我得到的是以下错误:

 $ rake db:migrate (in c:/rails/rails_projects/soccerweb) rake aborted! uninitialized constant Rake::DSL c:/Ruby192/lib/ruby/1.9.1/rake.rb:2482:in `const_missing' c:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.9.2.2/lib/rake/tasklib.rb:8:in `' c:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.9.2.2/lib/rake/tasklib.rb:6:in `' c:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.9.2.2/lib/rake/tasklib.rb:3:in `' c:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.9.2.2/lib/rake/testtask.rb:4:in `requ ire' c:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.9.2.2/lib/rake/testtask.rb:4:in `' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/test_unit/testing.r ake:2:in `require' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/test_unit/testing.r ake:2:in `' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/test_unit/railtie.r b:12:in `load' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/test_unit/railtie.r b:12:in `block in ' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/railtie.rb:183:in ` call' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/railtie.rb:183:in ` block in load_tasks' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/railtie.rb:183:in ` each' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/railtie.rb:183:in ` load_tasks' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/engine.rb:396:in `b lock in load_tasks' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/application/railtie s.rb:8:in `each' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/application/railtie s.rb:8:in `all' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/engine.rb:396:in `l oad_tasks' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/application.rb:103: in `load_tasks' c:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.1/lib/rails/railtie/configurabl e.rb:30:in `method_missing' c:/rails/rails_projects/soccerweb/Rakefile:7:in `' c:/Ruby192/lib/ruby/1.9.1/rake.rb:2373:in `load' c:/Ruby192/lib/ruby/1.9.1/rake.rb:2373:in `raw_load_rakefile' c:/Ruby192/lib/ruby/1.9.1/rake.rb:2007:in `block in load_rakefile' c:/Ruby192/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling' c:/Ruby192/lib/ruby/1.9.1/rake.rb:2006:in `load_rakefile' c:/Ruby192/lib/ruby/1.9.1/rake.rb:1991:in `run' c:/Ruby192/bin/rake:31:in `' 

但是当我在“rake db:migrate”命令之前使用“bundle exec”时,一切都优雅地为我工作!

谁能对我有所了解?

bundle exec rake运行你在Gemfile指定的rake版本。 rake的默认版本(可以在$PATH找到的版本)可能与bundle exec rake执行的版本不同。

您遇到的问题已在单独的问题中介绍 。 您的bundle exec rake最有可能运行rake 0.8.7并且来自$PATH rake是受此问题影响的较新版本。

引自man bundle exec :

bundle exec对shell环境进行了一些更改,然后执行完全指定的命令。

  • (……)
  • 将包含可执行文件的目录(例如rails,rspec,rackup)放在$ PATH上

Bundler为您解决gem依赖问题。 您可以在基本原理页面中找到有关它的最佳解释。