2013-05-10 129 views

回答

2

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

1

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

  1. gem install thin
  2. 有兩個文件創建一個目錄foo
    #! /usr/bin/ruby (or whatever the path to your system Ruby is)
    require 'thin'
  3. foo.rb可執行文件。
  4. 需要注意的是運行在命令行中都工作thin./foo.rb,但無論是之前與bundle exec將無法​​正常工作。
0

如果您在軌的任何命令之前使用bundle exec,它將搜索這是在我們的Gemfile應用的主文件夾中提到的寶石。

假設你有2個應用程序,並使用不同的Ruby版本爲他們每個人。 沒有bundle exec命令可能無法運行,因爲它可能需要不同版本的Gem才能運行該任務。但是,如果你開始使用bundle exec它將採用確切的寶石版本來運行任務/應用程序。

I recommend you to use **bundle exec** before any command.

0

束-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文檔。

相關問題