2011-11-26 54 views
69

我學習了Rails,只使用了像rake db:migrate這樣的rake命令;然而,我讀到我應該使用bundle exec rake ...而不是簡單的rake。現在我對使用哪一個感到困惑。使用bundle exec rake或只是耙?

我應該使用bundle exec rake而不是簡單的rake還是隻是一個偏好的事情?任何有識之士將非常感謝!謝謝!

回答

101

bundle exec在您的包的上下文中執行命令。

這意味着它使用Gemfile中指定的寶石。大多數情況下,運行bundle exec rake foo與運行rake foo的結果相同,尤其是如果您在系統範圍內安裝了與Gemfile中相同的gem。但是,某些應用程序可能會指定與系統範圍內安裝的不同版本的寶石,並且可能希望那些精確的寶石和版本能夠正確運行。如果你只運行沒有bundle exec,你可能會得到一些奇怪的錯誤。

使用bundle exec可以保證程序在gemfile中指定的環境下運行,希望這意味着它是程序創建者希望它運行的環境,希望這意味着它無論如何都能正確運行奇怪的設置你在你的電腦上。

它基本上標準化程序運行的環境。這有助於避免版本問題,讓生活變得更輕鬆。

有關更多信息,請參閱http://bundler.io/v1.3/man/bundle-exec.1.html

+4

如果您厭倦了隨時鍵入bundle exec,則可以配置rvm,因此它不是必需的:http://ruby.railstutorial.org/chapters/static-pages#sec:eliminating_bundle_exec –

+1

注意:Bundle手冊頁更改,截至此日期正確的是:http://bundler.io/v1.3/man/bundle-exec.1.html –

+1

使用'bundle exec'的一個很好的副作用是它也會告訴你如果您應該運行'bundle install'來安裝與Gemfile.lock文件相比缺少的寶石版本。 –

1

運行任何exacutable而沒有bundle exec將使Rubygems獲取安裝在系統中的最新版本的gem。

通過添加bundle exec前綴代替將在Gemfile.lock的上下文中運行可執行文件,這意味着將使用gem文件中定義的版本運行該可執行文件。

4

$捆綁高管耙分貝:遷移
使用在指定的Gemfile執行rake任務db:migrate耙的版本。

但是在Gemfile中沒有指定耙寶石!
是的,但一個耙寶石被安裝作爲一些其他寶石的依賴 - 看看Gemfile.lock。所以規則必須是:使用在Gemfile.lock中指定的rake版本。

但是Gemfile.lock沒有指定特定版本 - 它指定了一個大於x.y的版本!
然後,規則必須是:使用安裝在當前gemset中的rake版本。

$耙分貝:遷移
通常,當你在命令行上發出命令,例如rake,系統會在您的PATH環境變量中指定的目錄列表中搜索命令。包含該命令的第一個目錄是所用命令的版本。要查看哪些目錄,你可以這樣做:

$ which rake 

所以,如果你執行,

$ rake db:migrate 

可以使用不同的寶石耙比你bundle install安裝了一個。但是,即使您的系統發現與bundle exec相同的rake版本,也會在您項目的gemset之外的地方搜索rake源代碼所需的任何寶石。因此,有很多方法只是:

$ rake db:migrate 

可以搞砸了。

根據Ruby on Rails教程手冊(免費在線),第3.6節,如果您使用的是rvm 1.11.x +,那麼您不需要在bundle exec前面添加命令。

+0

不錯,謝謝 –

相關問題