2012-06-21 46 views
10

自第二次執行bundle install以來,只要Gemfile未更改,就會從Gemfile.lock中加載依賴項。直接修改Gemfile.lock會發生什麼?

但我想知道如何檢測這兩個文件之間的變化。例如,如果我直接向Gemfile.lock中添加新的依賴項而不將其添加到Gemfile中(與從Gemfile自動生成Gemfile.lock的最佳做法相反),那麼bundle install會將Gemfile作爲改變了?

確實,bundle install進程是否比較了整個Gemfile和Gemfile.lock樹以檢測更改?如果是這樣,即使我直接向Gemfile.lock添加依賴項,Gemfile也會被檢測爲已更改(因爲不同),並會重新清除Gemfile.lock(因此會失去添加的依賴項...)

bundle install自第二次推出以來的過程如何?

更清楚,我的問題是:

只從基於的Gemfile變化?這意味着bundler會保留每個執行編號爲N的Gemfile快照,並且僅將其與執行N + 1的bundle install進行比較?

或者在捆綁器內存中未創建快照,並且捆綁器每次都會與Gemfile.lock進行比較,以檢測是否必須將Gemfile視爲已更改。

+0

只需刪除Gemlock文件,將你需要的寶石放在gem文件中並運行'bundle install'。而已。我不認爲想想gemlock文件是個好主意。 ;) – uday

+0

@uDaY我同意你的意見,但我很好奇捆綁安裝的過程中的過程:) – Mik378

+3

你讀過[this](http://gembundler.com/rationale.html)和[this]( http://gembundler.com/man/bundle-install.1.html)? –

回答

15

如果您編輯您的Gemfile.lock,那麼Rails應用程序將依賴於其他版本的寶石......在這種情況下,您的寶石版本系統的完整性將被打破。直接編輯Gemfile.lock文件是一個非常糟糕的主意。

請,是一個很好的傢伙,讓涉及的Gemfile僅

1

我知道這個問題是很老了,但是我最近不得不處理這個,所以我給我自己的答案。 Omniauth最近更新到1.3.2版以修補安全問題。我的任務是將Omniauth更新到這個新的補丁版本,但是通過檢查我們的Gemfile,我意識到我們沒有那個Gem。所以我說好,也許我可以將Gemfile.lock上的版本從1.3.1切換到1.3.2。長話短說,這可能會奏效,但事實證明我不必這樣做。我最終什麼事做了以下命令

bundle update omniauth --patch

這就造成了相同的變化我會做手工:

- omniauth (1.3.1) 
+ omniauth (1.3.2) 

這就是說,如果你認爲你需要做出改變到Gemfile.lock,可能有一種方法可以在不觸及Gemfile.lock本身的情況下進行更改。只要做bundle --help,你可能會發現和選擇做你想要實現的。