2012-08-23 40 views
1

我一直在研究Bundler的頁面和RubyGem的頁面(和SO帖子),但似乎無法弄清楚。Bundler如何破譯哪個提交對應某個Gem版本?

在Gemfile中,您指定Bundler使用哪個版本的Gem。這就是我所知道的所有真實情況......剩下的就是我猜測幕後發生的事情。

因此,Bundler看起來像是去了RubyGems.org或其他一些資源來找出Gem的版本,依賴關係和源文件的位置。這是我的重要假設。

然後Bundler很可能會去代碼庫,最有可能的是Github,下載源代碼。這是我堅持的地方。如果某人指定1.0.0的版本,Bundler如何知道哪個Git commit與版本1.0.0相對應?

-Bundes go by tags?

- 或Bundler是否將頭部命名爲與版本號相同的分支?

- 或者在RubyForge的某處指定了具體的提交嗎?

- 或直接通過RubyForge的源代碼的快照嗎?

我想知道,因爲如果我指定一個Gem在1.0.0和做一個捆綁安裝。 Bundle在1.0.0分支的頭部提交提交(如果Bundler是這樣做的話),那麼如果該分支上有後續提交(但版本保持不變),這是否意味着我將擁有不同版本的那個寶石比在我後面捆綁的人(在後續的分支提交之後)?

這將是有道理的,bundler解析版本爲特定的提交,但bundler如何選擇提交?因爲版本1.0.0可以跨多個提交存在。

謝謝你的時間!

回答

0

將gem上傳到RubyGems.org時,代碼與gemspec一起打包到.gem文件中(實際上它是一個類似.zip或.tar.gz文件的存檔)。 RubyGems.org然後解壓縮gemspec並讀取它以獲取版本信息等。

當您在Bundler中指定gem版本時,它會與RubyGems.org一起檢查該版本是否可用。如果是這樣,它直接從RubyGems.org下載.gem文件並將其解壓縮,所有代碼都在.gem文件中,因此無需從GitHub下載。如果您指定了RubyGems.org上不存在的版本,則會出現錯誤。

Bundler從GitHub下載任何東西的唯一時間是如果您指定gitgithub而不是版本。在這種情況下,它將下載主分支中的最新提交(或Gemfile指定的任何分支),或者如果Gemfile.lock存在,則在Gemfile.lock中列出任何提交。

+0

@ steveh512哇...我不知道the.gem文件。這是完全合理的。謝謝你的信息。 –

相關問題