bundle exec rake db:migrate
是什麼意思?或者只是bundle exec rake <command>
一般?bundle exec rake是什麼意思?
我知道bundle
負責維護Gemfile中的內容。我知道「exec」這個詞的意思。據我所知,rake
保留了你可以做的所有不同的腳本事情,我知道db:migrate
就是其中之一。我只是不知道這些詞彙在一起做什麼。爲什麼要使用bundle
執行rake
來執行數據庫遷移?
bundle exec rake db:migrate
是什麼意思?或者只是bundle exec rake <command>
一般?bundle exec rake是什麼意思?
我知道bundle
負責維護Gemfile中的內容。我知道「exec」這個詞的意思。據我所知,rake
保留了你可以做的所有不同的腳本事情,我知道db:migrate
就是其中之一。我只是不知道這些詞彙在一起做什麼。爲什麼要使用bundle
執行rake
來執行數據庫遷移?
bundle exec
是Bundler命令,用於在當前捆綁包(目錄的Gemfile中的一個)上下文中執行腳本。 rake db:migrate
是腳本,其中db是命名空間,遷移是定義的任務名稱。
因此bundle exec rake db:migrate
在當前包的上下文中使用命令db:migrate
執行rake腳本。
至於「爲什麼?」我會從bundler page引用:
在某些情況下,沒有
bundle exec
運行可執行文件可以正常工作,如果可執行恰好被安裝在你的系統在任何寶石,以你的包衝突不拉。但是,這是不可靠的,是相當大的痛苦的來源。即使它看起來有效,它可能在未來或另一臺機器上都不起作用。
這意味着使用rake,bundler知道並且是您的Gemfile的一部分,而不是任何bundler不知道的rake,並運行db:migrate任務。
我還沒有使用bundle exec,但現在就設置它。
我有錯誤的耙子被使用和浪費很多時間來追蹤問題的情況。這有助於避免這種情況。
下面是如何設置RVM這樣你就可以在默認情況下的特定項目目錄內使用捆綁高管:
http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs
你的程序運行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版執行腳本,而不是你可能已經安裝了全系統的一些其他版本。
應該提及的是,有些方法可以省略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
這來了很多,當你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的,或什麼的。
超凡!解決了 – mariowise
謝謝,非常有教育意義。 – JnBrymn
bundle exec是什麼意思的最好解釋。謝謝。 – rmagnum2002
這是否意味着我們應該總是運行bundle exec,我已經使用ruby version manager在rails上安裝ruby和ruby。 –