2011-07-05 98 views
299

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

我知道bundle負責維護Gemfile中的內容。我知道「exec」這個詞的意思。據我所知,rake保留了你可以做的所有不同的腳本事情,我知道db:migrate就是其中之一。我只是不知道這些詞彙在一起做什麼。爲什麼要使用bundle執行rake來執行數據庫遷移?

回答

406

bundle execBundler命令,用於在當前捆綁包(目錄的Gemfile中的一個)上下文中執行腳本。 rake db:migrate是腳本,其中db是命名空間,遷移是定義的任務名稱。

因此bundle exec rake db:migrate在當前包的上下文中使用命令db:migrate執行rake腳本。

至於「爲什麼?」我會從bundler page引用:

在某些情況下,沒有bundle exec運行可執行文件可以正常工作,如果可執行恰好被安裝在你的系統在任何寶石,以你的包衝突不拉。

但是,這是不可靠的,是相當大的痛苦的來源。即使它看起來有效,它可能在未來或另一臺機器上都不起作用。

+3

謝謝,非常有教育意義。 – JnBrymn

+0

bundle exec是什麼意思的最好解釋。謝謝。 – rmagnum2002

+7

這是否意味着我們應該總是運行bundle exec,我已經使用ruby version manager在rails上安裝ruby和ruby。 –

0

這意味着使用rake,bundler知道並且是您的Gemfile的一部分,而不是任何bundler不知道的rake,並運行db:migrate任務。

125

你的程序運行bundle exec。該程序的創作者在某些版本的寶石可用時編寫了它。程序Gemfile指定了創建者決定使用的寶石版本。也就是說,腳本是針對這些gem版本正確運行的。

您的系統範圍的Gemfile可能與此Gemfile不同。你可能會有更新或更老的寶石,這個腳本不會很好玩。版本中的這種差異會給你奇怪的錯誤。

Bundle exec可以幫助您避免這些錯誤。它使用腳本的Gemfile中指定的gems而不是系統範圍的Gemfile來執行腳本。它使用shell別名的魔法執行某些gem版本。

查看更多關於the man page

下面是一個例子的Gemfile:

source 'http://rubygems.org' 

gem 'rails', '2.8.3' 

這裏,bundle exec將使用Rails 2.8.3版執行腳本,而不是你可能已經安裝了全系統的一些其他版本。

+9

我比OP選擇的這個答案更好:D!更清晰。 – lemavri

+1

因此,添加到這個例子:如果人只是簡單地運行'rake db:migrate'而不用'bundle exec',那麼它將使用系統範圍的Gemfile來執行,其中一個機架的版本爲1.5.2(最新版本)? –

+0

最好的和最簡單的可以理解的解釋。 – JVK

6

應該提及的是,有些方法可以省略bundle exec(它們全部在Michael Hartls Ruby on Rails Tutorial書的第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 install rubygems-bundler 
$ gem regenerate_binstubs 
7

這來了很多,當你Gemfile.lock的有不同的版本安裝在您的機器上的寶石。你可能會運行耙(或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

然後再次嘗試耙,RSpec的,或什麼的。

+0

超凡!解決了 – mariowise