2017-09-08 54 views
0

我在一個使用本機可執行文件開發gem的工程師團隊中工作。出於契約的原因,當我們部署到新環境時,所有依賴關係使用與我們測試的完全相同的版本,這一點很重要。 Gemfile只能維護一階依賴版本,而不能遞歸。由於這個原因,我們歷來將我們的lockfile保存在github中,但是這阻止了我們在1.14版本以後升級bundler。問題是,我們有發展的機器,都是OSX和Linux,並開始在1.14,在寶石倉庫鎖文件的開頭改變來自:使用本機擴展爲Gem維護一致的Gemfile.lock

PATH 
    remote: . 
    specs: 
    engine (21.2.13) 
     <gemspec dependencies here> 

PATH 
    remote: . 
    specs: 
    engine (21.2.13-x86_64-linux) 
     <gemspec dependencies here> 

這是一個問題,因爲當開發人員在OSX上提取回購併運行bundle install時,它將更改鎖文件的內容。然後,當一個linux開發者也這樣做時,它會再次發生變化,在鎖文件的git歷史記錄中產生一系列虛假更改!

我試着運行bundle lock --add-platform x86_64-linuxbundle lock --add-platform x86_64-darwin,希望這會說服bundler爲不同的平臺維護兩個條目,而不是在它們之間翻轉。它確實爲產生了鎖文件的GEM部分中某些寶石的重複條目,但不是PATH\n specs:部分中的一個。

目前,我們的Gemfile包含行:

gemspec name: "engine" 

它加載engine.gemspec。此文件包含:

Gem::Specification.new do |spec| 
    ... 
    spec.platform = Gem::Platform::CURRENT 
    ... 
end 

我懷疑是問題所在。我嘗試在Gemfile中包含gemspec 兩次,並使用全局變量指定要使用的平臺,但是bundler僅在第一次加載它時跳過第二次嘗試。

有誰知道一種解決方案,可以讓我們將平臺特定的gem版本保存在同一個鎖文件中?

否則,有沒有辦法關閉捆綁者的新行爲,將平臺名稱附加到寶石版本?在過去,當lockfile簡單地指定「21.2.13」,並且我們的gemserver包含每個版本的兩個副本(爲這兩個平臺構建的二進制文件)時,bundler從未有任何問題解決當前機器的正確版本,所以這似乎就像鎖文件存儲多餘的信息一樣。我能以某種方式告訴它停止嗎?

回答

0

我曾多次聽說過,推薦使用並不推薦在版本控制中使用lockfile,但從未完全理解原因。這似乎是問題的根源!

推薦我最常看到(雖然這可能並不總是可能),是鎖文件不應該版本控制的寶石下,但始終是一個獨立的應用程序。這個想法是,寶石是可移植的,所以它的依賴性應該有一定的靈活性。重要的是,這種靈活性並不妨礙我們的開發環境保持一致,前提是所有測試不是發生在gem存儲庫中,而是發生在使用gem的獨立應用程序的存儲庫中。

該獨立應用程序的鎖定文件已經跟蹤我們認爲使用gem的lockfile進行跟蹤的依賴關係,並且應用程序部署時,所有gem的依賴關係都在應用程序內部修復,而不是在gem內部。

Gemfile.lock的「spec」部分應該只出現在一個gem倉庫中,並且這個部分以平臺相關的方式命名gem的事實不是問題,因爲該gem被平臺無關名稱在使用它的應用程序的鎖定文件中。

相關問題