2012-02-09 132 views
0

總之不同版本耙,錯誤消息看起來像以下:Gemfile.lock的在部署環境

$ bundle install 
rake aborted! 
You have already activated rake 0.9.2.2, but your Gemfile requires rake 0.9.2. Using bundle exec may solve this. 

這裏是這個錯誤的解釋:

  • 部署服務器rake 0.9.2.2安裝
  • 應用程序Gemfile沒有要求的版本號rake
  • 開發者的d纔有發展環境rake 0.9.2安裝這個版本號是Gemfile.lock文件
  • 部署服務器已安裝了多個Rails應用
  • 這些應用程序是由不同的程序員編寫
  • 這些程序員們安裝在不同耙的版本開發環境
  • 他們有的rake 0.9.2等都有rake 0.9.2.2
  • 通過閱讀Yehuda Katz's Clarifying the Roles of the .gemspec and GemfileGemfile.lock文件是我們顛覆

可能的解決方案:可以通過運行bundle exec rake install避免

  • 錯誤信息,那麼bundle update
  • 如果我們要求所有開發商指定 Gemfile耙的相同版本可避免
  • 錯誤信息
  • 要求所有開發者使用相同版本的耙

我的問題是:這是正確的解決方案嗎?還是有任何正確的解決方案?

我仍然不確定Gemfile.lock文件應該在顛覆。

+0

另一種可能的解決方案是使用RVM:RVM讓您可以使用自己完全獨立且專用的環境部署每個項目 - 從特定版本的Ruby,一直到所需的精確gem集,以運行您的應用程序。 – peterpengnz 2012-02-12 01:27:15

回答

4

你一定要檢查你的Gemfile.lock。它包含您知道將與您的應用程序配合使用的寶石版本。所以,當你將安裝捆綁到不同的環境時,你知道它應該可以工作。

說幾個月後,現在有人會在沒有Gemfile.lock的情況下安裝一個軟件包。他們會在你的Gemfile中獲得最新版本的寶石(至少是指定版本的寶石),並且不能保證你的應用程序甚至可以使用這些寶石。使用Gemfile.lock,應該保證你的應用程序應該運行,因爲任何使用它的人或者運行測試的人都應該使用那些凍結的gem版本。

解決您的問題,我會做:

bundle update rake 

,然後提交的Gemfile和Gemfile.lock的。這樣,你告訴任何運行你的應用程序的人,你應該使用0.9.2.2的耙子。這是您知道將與您的應用程序一起使用的rake版本,並且您的測試針對此版本運行。

實際運行正確的版本,你有幾個選擇:

  • 捆綁高管:

    $ bundle exec rake -T 
    

添加一個別名到你的.bash_profile,.zshrc,或.profile也可能有所幫助:

# in .bash_profile 
alias b="bundle exec" 
$ b rake -T 
  • 束binstubs

    # in your .bash_profile 
    export PATH="./.bin:$PATH" 
    $ bundle install --binstubs 
    

這會安裝Gemfile中的二進制文件./bin目錄和路徑變化將迫使你的shell在./bin先檢查在尋找RVM之前或您的創業板安裝二進制文件。如果你這樣做,記得在你的.gitignore文件中添加'bin'。

  • rubygems-bundler寶石。這個gem生成包裝器,試圖確定何時使用bundle exec。
+0

很好的答案。不過,我認爲最好的解決方案是要求所有開發人員使用相同版本的rake。通過將更新的Gemfile和Gemfile.lock重新提交給版本控制,只解決了一個應用程序的問題。在生產服務器上,我們有很多應用程序。出於某種原因,一旦你爲一個應用程序激活了rake 0.9.2.2。您會發現其他使用rake 0.9.2的應用程序無法重新啓動。所以不知何故,我們需要保持所有應用程序的rake版本相同。這可能不是技術問題,而是合乎邏輯的。我忘了在我的問題中提到RVM。 – peterpengnz 2012-02-12 00:40:52

+0

繼續... RVM創建單獨的寶石套裝。這可能是解決這個問題的技術方案。謝謝 – peterpengnz 2012-02-12 00:43:10

1

生產力耗盡你的團隊將與試圖讓每個人都在同一個版本的rake(第二和第三的解決方案),並管理所有下游的衝突可能是非常高的體驗。當他們需要使用gem/script/module XYZ但是XYZ和rake的強制版本存在問題時,它也會提高開發者的沮喪程度。

只要採取措施確保bundle命令在您的環境中高效執行,解決方案1將對您的團隊的生產力產生較小的負面影響。恕我直言。

+0

這是真的。這不簡單。如果其中一個gem只需要用於rake 0.9.2.2或rake 0.9.2,開發人員將會感到沮喪。而你無法控制其他人的寶石。我想我現在正在改變我的結論:理論上的最佳解決方案是要求所有開發人員使用相同版本的Rake。我希望RVM能爲我解決問題,因爲它爲每個rails應用程序創建單獨的gem集。 – peterpengnz 2012-02-12 00:46:52