2016-07-26 79 views
1

Gemfile.lock是不是用來維持依賴版本控制中不好實踐的黑客攻擊?爲什麼我們需要Ruby中的Gemfile.lock?

I.e.開發人員不應該嚴格在Gemfile中設置依賴版本範圍嗎?

例如,如果我的Gemfile說我依賴gem版本1.0.1或版本[1.0-2.0),爲什麼我需要.lock?

回答

5

不,Gemfile.lock具有很多意義,並且是自動挑選寶石版本的關鍵。作爲開發人員,您無需擔心確切的版本號。你可以說「給我任何版本的寶石X適合所有其他寶石的其他版本」(只需說gem 'xyz'沒有任何進一步的信息)。或者你可以告訴它保持在老版本的寶石(gem 'xyz', '~> 2.3.0')或其他任何東西的bug修復行中。

通過在Gemfile.lock中添加確切的版本,然後確保版本對於所有開發人員(和環境)保持一致。您將升級到更新版本的gem,而不是構建/部署過程的隨機部分。

+0

如果至關重要,npm,bower,maven,OSGi等系統如何不使用它?根據Gemfile的版本範圍,部署系統在所有gem中使用最兼容的依賴版本是否合理? – PedroD

+0

@PedroD對於npm,有[shrinkwrap](https://docs.npmjs.com/cli/shrinkwrap),它做了非常相似的事情。其他人可能還沒有實現它,因爲人們使用不同的生態系統或因爲它太難實現(它肯定是,尤其是遞歸和循環依賴) –

+0

@PedroD,我沒有看到那些其他系統必須處理它。我相信我給出了兩個非常明確的理由,爲什麼它是有用和重要的。如果你覺得不服氣或者我的解釋不好,我很樂意解釋更多。如果你想要另一個正面的例子,請考慮Perl世界中的'carton',它完全像ruby中的'bundler'。 – AnoE

2

爲什麼我需要.lock?

要安裝與團隊中所有其他人完全相同的版本。或者在生產環境中安裝與開發中使用的版本相同的版本。

當您收集您發佈的簽名時,可能會發布某個gem的新版本。你最好確保你安裝/加載剛好你開發/測試的版本。

+0

最後一句話,「你最好確定你安裝/加載了你開發/測試過的版本,」與我產生共鳴,因此贏得了我的讚賞。 – pjd