運行rake命令有和沒有bundle exec之間的主要區別是什麼?運行rake命令有和沒有bundle exec之間的區別
我見過很少的帖子說過,當你使用bundle exec運行命令時,它將在gem文件中定義的gems版本的作用域上運行。如果是這樣的話,那麼它應該強制運行帶有'bundle exec'的rake命令?
運行rake命令有和沒有bundle exec之間的主要區別是什麼?運行rake命令有和沒有bundle exec之間的區別
我見過很少的帖子說過,當你使用bundle exec運行命令時,它將在gem文件中定義的gems版本的作用域上運行。如果是這樣的話,那麼它應該強制運行帶有'bundle exec'的rake命令?
bundle exec rake some:task
在捆綁包的上下文中運行rake任務。
你沒有明確提到Rails的,但我看到你後進行標記使用Rails所以這個動作一做作例子可能是以下幾點:
你有虛構whateva-whateva
寶石的2.0版本出於某種有效的原因安裝在您的系統上。
您決定從某個地方下拉一箇舊的Rails項目,並在克隆項目的根文件夾中運行bundle install
。該命令將安裝Rails應用程序需要的所有寶石,其中一個恰好是虛構的whateva-whateva
寶石的版本1.0。
所以目前的狀態是這樣的:您的舊rails應用程序有一個gem包,其中包含舊版本的whateva-whateva
,而您的系統級寶石包含更新版本的whateva-whateva
gem。
當您運行與您的Rails應用程序相關的rake任務時,您想要加載哪個版本?當然是老一套。
爲了做到這一點,您可以使用bundle exec rake the:task
,它會在您的包的上下文中運行rake命令 - 舊版本的gem加上其他任何東西在舊rails應用程序的Gemfile中指定的內容。
所以,畢竟,我認爲可以肯定地說最好的做法是,你應該總是預先支付bundle exec
,但說實話我很懶,很少這樣做,除非我看到問題。
在其他消息中,如果使用Bundler的binstub,則不需要添加它。這裏有一個鏈接設置,最多:http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs
BUNDLE_GEMFILE=/path/to/gemfile bundle exec
可以用來先於任何命令(如果BUNDLE_GEMFILE
未指定它搜索了文件系統,並使用它找到的第一個),而不僅僅是rake
。
您運行的任何命令都可能會調用可執行的Ruby命令(例如rake
)或需要Ruby庫(例如Rake::Task
類)的代碼,這些東西通常由gems提供。 gem env
告訴你gem提供的庫和可執行文件在哪裏。但是,如果您使用bundle exec
,則會將可用寶石限制爲與Gemfile
關聯的Gemfile.lock
文件中指定的寶石,您的bundle exec
上下文正在使用該寶石。
計算機上使用所有可用的寶石(如果你不這樣做bundle exec
它可以發生),可以爲一對夫婦的原因是不可取的:
這裏有一個快速的方法來看到其中的差別。一個空的Gemfile,並與內容的文件foo.rb
:
gem install thin
foo
#! /usr/bin/ruby (or whatever the path to your system Ruby is)
require 'thin'
foo.rb
可執行文件。thin
和./foo.rb
,但無論是之前與bundle exec
將無法正常工作。如果您在軌的任何命令之前使用bundle exec
,它將搜索這是在我們的Gemfile應用的主文件夾中提到的寶石。
假設你有2個應用程序,並使用不同的Ruby版本爲他們每個人。 沒有bundle exec命令可能無法運行,因爲它可能需要不同版本的Gem才能運行該任務。但是,如果你開始使用bundle exec
它將採用確切的寶石版本來運行任務/應用程序。
I recommend you to use **bundle exec** before any command.
束-EXEC - 在管束
此命令的上下文中執行的命令執行該命令,使得在Gemfile中(5)可指定爲需要Ruby程序所有寶石。
這不是唯一的耙,而不是適用於軌道,RSpec的,rackup命令了。從本質上講,如果你通常會運行類似rspec spec/my_spec.rb的東西,並且你想要使用Gemfile(5)中指定的並且通過bundle install(1)安裝的gems,那麼你應該運行bundle exec rspec規格/ my_spec.rb。
注意捆綁高管並不需要一個可執行文件可以用shell的$ PATH。
更多細節,看看到bundle exec文檔。