[英]When do bundler update the gem incase of gems pointed to git repo?
我試圖將3 Rails應用程序的常用功能移動到gem中。 我創建了gem,在本地測試它,並將移動到私有存儲庫。
所以,現在我擔心如果我在gem中的代碼有變化,如何處理大小寫。 我是否需要更改gem的版本,如果我想在bundle update mygem
時bundle update mygem
,或者Bundler會在執行bundle update mygem
檢測git repo的提交哈希值的變化?
由於您的Gemfile
將在私有git存儲庫中引用您的gem,因此為了讓您的應用程序獲取gem中的任何新更改,您需要執行bundle update gemname
。 純粹而簡單。 如果您不這樣做,bundle將不會接收更改。
Bundler使用鎖定在Gemfile.lock
文件中的gem版本,以便在您的應用程序中啟動/使用它。 只有Gemfile.lock
bundle update
才會更新Gemfile.lock
的版本信息。 否則它被鎖定 (也就是Gemfile.lock
)並且正在使用任何被鎖定的版本。
BTW,引用私有git存儲庫中的gem可以有很多選項( :branch
, :tag
等),但這是無關緊要的。 鎖定將發生在什么地方。
我希望這個解釋捆綁器如何工作。
每次對其進行更改時,都無需更改gem內的版本。 使用git gems時, Gemfile.lock
鎖定提交哈希而不是版本號。 您根本不需要指定版本。
當你運行bundle update mygem
並且mygem
是一個git gem時,它會將鎖定的提交哈希更新為你指定的分支上的最新可用(如果你沒有指定分支,則更新為master
)。
好問題,我認為當你運行bundle update my_gem
,任務只檢查你安裝的版本與gem分支上的版本,而不檢查master gem分支的哈希值。
我是這么認為的,因為我一直運行bundle update
,只有在檢測到新版本(大於我的本地版本)時才會運行gem的“更新過程”。
以下一些參考文獻:
編輯
我看到你可以在Gemfile中檢查顯式聲明的遠程哈希:
# Specify that a git repository should use a particular ref, branch, or tag
:git => 'git://github.com/rails/rails.git', :ref => '4aded'
:git => 'git://github.com/rails/rails.git', :branch => '2-3-stable'
:git => 'git://github.com/rails/rails.git', :tag => 'v2.3.5'
但是對於“自動修復”,如果寶石版本比你的本地版本更新,我認為更好的方法是指定一個版本。
編輯2
也許指定一個:branch
git gem repo的:branch
是你正在尋找的解決方案。
:git => 'git://github.com/rails/rails.git', :branch => 'my_current_master_branch'
我沒有意識到,因為我擁有寶石,我可以更新寶石並自己檢查一下。 我剛試了一下,這是我的發現:
只有當我們在任何寶石的情況下運行bundle update gemname
時,gem才會bundle update gemname
,無論是來自git repo還是來自rubygems.org。 如果沒有Gemfile.lock
給出的gem的詳細信息(或者如果Gemfile.lock
不存在),它將獲取最新的gem並在Gemfile.lock中寫入gem的詳細信息。
對於來自git repo的gem的情況,當我們運行bundle update gemname
,它會更新到gem的相關分支的最新提交哈希(在我的例子中,它是master),並且它將提交哈希寫入Gemfile.lock
。 在我的例子中,它看起來像這樣(注意revision
塊):
GIT
remote: git@myprivaterepo.com:mygem.git
revision: 5311ed765d5724cd20dfbcb87aa66b6f6fcbee7d
specs:
mygem (0.0.1)
對於我們運行bundle update gemname
時來自rubygems的gem的情況,如果新版本可用並且Gemfile.lock
看起來像這樣,它會更新:
GEM
remote: https://rubygems.org/
specs:
actionmailer (3.2.13)
所以,為了回答我自己的問題,當我對git repo中的gem進行bundle update mygem
,它會更新到Git bundle update mygem
中的最新提交哈希值(即使gem的版本未更改)。 所以,我不需要更改gem的版本,我只需要推送到git repo並在使用mygem
的真實項目中bundle update mygem
mygem
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.