我在一個使用本機可執行文件開發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-linux
和bundle 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從未有任何問題解決當前機器的正確版本,所以這似乎就像鎖文件存儲多餘的信息一樣。我能以某種方式告訴它停止嗎?