2012-06-20 75 views

回答

23

第一線在你具體例如bundle exec ruby foo.rb

  • 紅寶石的過程中,他們可以被認爲是相同的,但在現實中,他們是不一樣的。

    bundle execbundler/setup未生成的環境進行了一些更改。如果您的foo.rb從不運行子shell,或者從不嘗試在子殼中運行其他ruby可執行文件,那麼兩個版本都是等效的(它們都將正確加載捆綁的gem並且工作方式完全相同)。

    bundle exec的整體思路是,使您能夠運行可執行文件不是最初設計與捆綁考慮。像rspec,rails,rackup。如果您的應用程序(foo.rb)未嘗試運行可能依賴於您的軟件包的可執行文件,則兩種方式都沒有區別。因爲所有你想確認捆綁器是你加載正確的寶石,併爲此bundler/setup完全符合您的情況預期。

    在某些情況下,運行無束的exec可執行文件可以正常工作,如果可執行恰好被安裝在你的系統在任何寶石不拉:談論運行紅寶石系統可執行文件時,

    bundler docs與您的包相沖突。

    但是,這是不可靠的,是相當大的痛苦的來源。即使它看起來有效,它可能在未來或另一臺機器上都不起作用。

    然後從manpage of bundle exec你可以得到一些額外的線索,有的bundle exec實際上做:

    環境MODIFICATIONS

    • 確保它仍然可以掏出捆綁從bundle exec(使用$ BUNDLE_BIN_PATH)調用的命令中執行
    • 將目錄包含進不去的可執行文件(如導軌,RSpec的,rackup)爲您的$ PATH束
    • 確保,如果捆綁在子shell調用,它使用相同的Gemfile(通過設置BUNDLE_GEMFILE)
    • 添加-rbundler /設置到$ RUBYOPT,這可以確保在子shell調用Ruby程序可以看到寶石的束

    所以,如果你建立在頭腦捆綁支持你的應用程序,那麼你永遠不需要bundle exec您的應用程序。

    但是,如果你需要使用其他工具加載你的應用程序代碼之前可能加載寶石它們加載你的應用程序代碼(然後可能會拉在一個錯誤的非綁定的寶石),那麼你需要使用bundle exec

  • +0

    很好的回答,非常感謝你! –