我學習了Rails,只使用了像rake db:migrate
這樣的rake命令;然而,我讀到我應該使用bundle exec rake ...
而不是簡單的rake
。現在我對使用哪一個感到困惑。使用bundle exec rake或只是耙?
我應該使用bundle exec rake
而不是簡單的rake
還是隻是一個偏好的事情?任何有識之士將非常感謝!謝謝!
我學習了Rails,只使用了像rake db:migrate
這樣的rake命令;然而,我讀到我應該使用bundle exec rake ...
而不是簡單的rake
。現在我對使用哪一個感到困惑。使用bundle exec rake或只是耙?
我應該使用bundle exec rake
而不是簡單的rake
還是隻是一個偏好的事情?任何有識之士將非常感謝!謝謝!
bundle exec
在您的包的上下文中執行命令。
這意味着它使用Gemfile中指定的寶石。大多數情況下,運行bundle exec rake foo
與運行rake foo
的結果相同,尤其是如果您在系統範圍內安裝了與Gemfile中相同的gem。但是,某些應用程序可能會指定與系統範圍內安裝的不同版本的寶石,並且可能希望那些精確的寶石和版本能夠正確運行。如果你只運行沒有bundle exec
,你可能會得到一些奇怪的錯誤。
使用bundle exec
可以保證程序在gemfile中指定的環境下運行,希望這意味着它是程序創建者希望它運行的環境,希望這意味着它無論如何都能正確運行奇怪的設置你在你的電腦上。
它基本上標準化程序運行的環境。這有助於避免版本問題,讓生活變得更輕鬆。
運行任何exacutable而沒有bundle exec
將使Rubygems獲取安裝在系統中的最新版本的gem。
通過添加bundle exec
前綴代替將在Gemfile.lock的上下文中運行可執行文件,這意味着將使用gem文件中定義的版本運行該可執行文件。
$捆綁高管耙分貝:遷移
使用在指定的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
前面添加命令。
不錯,謝謝 –
如果您厭倦了隨時鍵入bundle exec,則可以配置rvm,因此它不是必需的:http://ruby.railstutorial.org/chapters/static-pages#sec:eliminating_bundle_exec –
注意:Bundle手冊頁更改,截至此日期正確的是:http://bundler.io/v1.3/man/bundle-exec.1.html –
使用'bundle exec'的一個很好的副作用是它也會告訴你如果您應該運行'bundle install'來安裝與Gemfile.lock文件相比缺少的寶石版本。 –