2013-03-22 24 views
0

看來,當我運行bundle package然後bundle install --local然後我運行unicorn_rails,獨角獸仍然訪問系統寶石。我不斷收到:得到獨角獸只能訪問供應商/緩存寶石

您已啓動機架1.5.2,但您的Gemfile需要機架 1.2.8。使用bundle exec可以解決這個問題。

而且它不應該因爲rack 1.2.8在供應商/緩存中。

bundle exec不會工作,因爲它似乎是一個資源豬,整個bundle package點是避免這一整個混亂首先。

那麼如何讓獨角獸獲得捆綁環境才能使用供應商/緩存寶石?

回答

3

bundle install --local需要使用vendor/local中的寶石,並使用任何默認的gem命令進行安裝。默認情況下,這是一個系統範圍的安裝。如果您正在使用RVM或其他東西,它將在您當前的RVM gemset中。

如果您正在生產中進行安裝,並且您想從vendor/local將應用程序限制爲您的寶石,那麼您需要執行bundle install --deployment。這會將寶石安裝到vendor/bundle中,並將Bundler設置爲使用這些寶石(並且只有那些寶石,而不是系統寶石)。如果寶石不在vendor/local中,它會下載它們。它不會更新您的Gemfile.lock,最佳做法是讓您的所有寶石保持在vendor/cache以防止它甚至嘗試下載寶石。

除非您正在運行某個寶石的二進制文件,否則不需要使用bundle exec。如果您運行的是rails server並且遇到此問題,原因是rails命令是從shell的$PATH運行的。這大概是Rails的一個不同於你想使用的版本。

如果是這樣的話,你的選擇是追查的路徑,你想的rails版本並運行它明確,使用bundle exec,或運行bundle install --binstubs --deployment並添加bin目錄添加到您PATH。我沒有注意到任何來自bundle exec的開銷,但如果你擔心這一點,並且仍然希望將所有內容都包括在你的包中,那麼使用--binstubs(順便說一下,Heroku就是這麼做的)。

+0

後續注意事項:在這種情況下,'rails'不再是一個問題,因爲它現在只運行'script/rails'(如果存在的話),這將是Bundle範圍的。有關二進制路徑的其他一切仍然適用於其他寶石('rspec'是一個值得注意的寶石)。如果您正在運行'unicorn'或'foreman'或'guard'或'spork'或任何其他Ruby gem二進制文件,則需要解決路徑問題。 – 2013-03-23 02:47:51

+0

感謝@Jimmy Stewart!我真的想把我所有的寶石保存在我的倉庫中。我有另一個Rails應用程序運行(Redmine),似乎衝突總是在發生。此外,我不想依賴rubygems.org總是在那裏或總是可用,並在某些情況下github寶石。捆綁安裝--binstubs - 部署或捆綁安裝 - 部署是製作「自包含」應用程序的最佳方式?如果是這樣,那麼如果gem現在在vendor/bundle中,那麼cache目錄的目的是什麼? – Jon 2013-03-23 14:13:22

+1

'bundle install --binstubs --local --deployment'就是你想要的。在你的項目中創建binstubs,防止下載寶石,將寶石安裝到'vendor/bundle'中,並且只使用那些寶石。 'vendor/cache'目錄包含Gem_source code_('.gem'文件)。'vendor/bundle'目錄中充滿了解壓縮,編譯好的(如果需要的話),隨時可用的gem。這就是'require'最終會在您的應用運行時加載它們的地方。 – 2013-03-23 17:43:16