2010-11-11 114 views
430

我對捆綁器及其生成的文件有點新鮮。我有一份GitHub的git repo副本,許多人都在貢獻它,所以我很驚訝地發現bundler創建了一個不存在於repo中但不在.gitignore列表中的文件。Gemfile.lock應該包含在.gitignore中嗎?

由於我已經分叉它,我知道將其添加到回購不會破壞主回購的任何東西,但如果我做了拉請求,會導致問題?

Gemfile.lock應該包含在存儲庫中嗎?

+0

相關:http://stackoverflow.com/questions/14034561/should-gemfile-lock-be-committed-to-source-control-on-windows – ripper234 2012-12-25 22:56:12

+2

如果你發現你的因爲你的Linux和Windows機器共享相同的回購,請參閱Joe Yang的回答。在我寫這篇文章的時候,它排名第三。另請參閱http://stackoverflow.com/questions/14034561/should-gemfile-lock-be-committed-to-source-control-on-windows – 2013-10-10 19:11:52

回答

476

假設你沒有編寫rubygem,Gemfile.lock應該在你的倉庫中。它被用作所有你需要的寶石及其依賴關係的快照。這樣bundler不必重新計算每次部署時所有的gem依賴關係,等等。

來自cowboycoded的評論。

如果您正在開發一個gem,那麼DO 不要檢查您的Gemfile.lock。

下面是一個不錯的article解釋鎖文件是什麼。

+78

取決於你在做什麼。如果你正在開發一個gem,那麼不要檢查你的Gemfile.lock。如果您正在使用Rails應用程序,請檢查您的Gemfile.lock。更多信息在這裏 - http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ – johnmcaliley 2011-02-04 15:22:06

+0

非常好的一點。 – rwilliams 2011-02-04 22:24:12

+0

Thx幫助文章。 – a5his 2011-03-21 04:49:20

11

與R-DUB達成一致,保持它在源代碼控制,但對我來說,真正受益的是這樣的:在相同的環境(不考慮windohs和Linux/MAC的東西)

合作。在Gemfile.lock之前,下一個安裝該項目的人可能會看到各種令人困惑的錯誤,並指責自己,但他只是那個幸運的人獲得下一版超級寶石,打破現有的依賴關係。

更糟糕的是,這種情況發生在服務器上,除非受到處罰並安裝確切的版本,否則會獲得未經測試的版本。 Gemfile.lock明確表示,它會明確告訴你,你的版本是不同的。

注:記到的東西,如:開發:測試

46

,當你在一個開源的Rails應用程序需要具有可配置數據庫適配器工作發生真正的問題。我正在開發Fat Free CRM的Rails 3分支。 我的首選是postgres,但我們希望默認數據庫是mysql2。

在這種情況下,Gemfile.lock仍然需要使用默認的寶石集檢入,但我需要忽略我在機器上對它所做的更改。要做到這一點,我跑:

git update-index --assume-unchanged Gemfile.lock 

,並扭轉:

git update-index --no-assume-unchanged Gemfile.lock 

它也是有用的,包括你的Gemfile類似下面的代碼。這將根據您的database.yml加載相應的數據庫適配器gem。

# Loads the database adapter gem based on config/database.yml (Default: mysql2) 
# ----------------------------------------------------------------------------- 
db_gems = {"mysql2"  => ["mysql2", ">= 0.2.6"], 
      "postgresql" => ["pg",  ">= 0.9.0"], 
      "sqlite3" => ["sqlite3"]} 
adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml")) 
    db = YAML.load_file(db_config) 
    # Fetch the first configured adapter from config/database.yml 
    (db["production"] || db["development"] || db["test"])["adapter"] 
else 
    "mysql2" 
end 
gem *db_gems[adapter] 
# ----------------------------------------------------------------------------- 

我不能說這是否是一個既定的最佳做法,但它對我而言效果不錯。

+1

+1感謝您的輸入。 – DJTripleThreat 2011-03-19 20:35:26

+2

非常有用的信息...不確定爲什麼你只有3分,而有用的答案有50分。哦,是的,看看日期戳。 (SO的一個重大失敗是在詢問問題後很快回答的不成比例的益處)。 – iconoclast 2011-10-01 02:35:47

+1

@iconoclast:我很高興你發佈了你所做的事情。我認爲包括我自己在內的很多來這個職位的人都被問題標題「蒙上了一層陰影」。我現在意識到我的答案只是回答一個特定的用例,而不一定是這個問題的正確答案。我會在不久的將來更新它。也就是說,如果OP沒有滿足他/她的需求,OP應該沒有標記我的答案是正確的。 – rwilliams 2012-01-22 09:18:27

31

我和我的同事有不同的Gemfile。因爲我們使用不同的平臺,windows和mac,而我們的服務器是linux。

我們決定刪除repo中的Gemfile.lock,並在git repo中創建Gemfile.lock.server,就像database.yml一樣。然後之前部署在服務器上,我們複製Gemfile.lock.server使用帽鉤部署在服務器上Gemfile.lock的

+5

我有一個應用程序,我在OSX中開發,然後必須在Windows服務器上部署。用git跟蹤Gemfile.lock被證明是一個壞主意,所以它在我的.gitignore文件中。很多寶石需要不同的版本來適應不同的環境。理想情況下,你應該避免在這種情況下,但我沒有選擇(該死的你I.T部門!) – brad 2012-02-26 23:05:31

9

所述捆綁文檔解決這個問題還有:

ORIGINAL:http://gembundler.com/v1.3/rationale.html

編輯: http://web.archive.org/web/20160309170442/http://bundler.io/v1.3/rationale.html

見「檢查你的代碼版本控制」一節:

制定一個WH您的應用程序後ile,與Gemfile和Gemfile.lock快照一起檢入 應用程序。現在, 您的存儲庫記錄了您上一次確定應用程序 工作時使用的所有寶石 的確切版本的記錄。請記住,儘管您的Gemfile只列出了三個寶石 (具有不同程度的版本嚴格性),但您的應用程序依賴於 幾十個寶石,一旦考慮了所依賴的寶石的所有隱含需求。

這很重要:Gemfile.lock使您的應用程序包含您自己的代碼和第三方代碼,它運行的最後一個 時間確保一切正常。指定在您的Gemfile中依賴的第三方代碼的確切 版本 不能提供相同的保證,因爲寶石通常會爲其依賴項聲明 版本的版本。

下一次在同一臺機器上運行軟件包安裝時,bundler將 看到它已具有所需的所有依賴關係,並跳過 安裝過程。

請勿檢入.bundle目錄或其中的任何文件。 這些文件是特定於每臺特定計算機的,並且用於在軟件包安裝 命令的運行之間持續執行的安裝選項 。

如果您已經運行了捆綁軟件包,您的捆綁軟件所需的寶石(儘管不是git寶石) 將被下載到供應商/緩存中。 Bundler 可以在沒有連接到互聯網(或RubyGems服務器)的情況下運行,如果 您需要的所有寶石都存在於該文件夾中並簽入到 您的源代碼管理。這是一個可選步驟,不建議使用,因爲您的源代碼控制庫的大小增加了,因此不建議使用 。

+0

很好的解釋,謝謝。 – akostadinov 2014-03-11 14:20:45

3

晚會有點遲,但答案仍然花了我時間和外國讀取,以瞭解這個問題。所以我想總結一下我對Gemfile.lock的瞭解。

當您構建Rails應用程序時,您正在本地機器中使用特定版本的gem。如果您想避免生產模式和其他分支出現錯誤,那麼您必須隨處使用一個Gemfile.lock文件,並告訴bundler到bundle,以便在每次更改時重新構建寶石。

如果Gemfile.lock已經改變了您的生產機器和Git不會讓你git pull,你應該寫git reset --hard,以避免文件的更改和重新寫入git pull

+0

如果文件自動更改,例如通過構建過程,這是一個明確的信號,它不應該添加到版本控制中。 – 2017-11-03 08:58:21

3

沒有Gemfile.lock的意思是:因爲奇怪的事情失敗

  • 新的貢獻者無法運行測試,所以他們不會貢獻或取得永久居民失敗...壞第一次經歷。
  • 你不能回去斧頭歲的項目和修復bug,而不必更新/重寫項目,如果你失去了你的本地Gemfile.lock的

- >經常檢查Gemfile.lock的,讓特拉維斯刪除它如果你想要更加徹底https://grosser.it/2015/08/14/check-in-your-gemfile-lock/

相關問題