2013-02-11 87 views
1

如何將我的代碼的版本號存儲在ruby gem中?將版本號存儲在Ruby Gem中

我見過在野外兩種技術:

  1. <gem root>/VERSION只包含您semver
  2. <gem root>/lib/your_gem/version.rb它包含以下代碼:

 

module IfYourCodeIsInAModule 
    class YourGem 
    VERSION="0.0.1" 
    end 
end 

我喜歡1,因爲它真的很明顯。我喜歡2.因爲它是我的代碼的一部分,所以我可以輕鬆地用我的版本號寫入日誌。

我不喜歡1,因爲如果我想從我的代碼中訪問的版本號我要做的讀取文件(不是有史以來最糟糕的事情),我不,因爲如果喜歡我的2芯班級從另一個班級延伸,那麼我也必須在version.rb也有這種優越感(否則得到一個superclass mismatch) - 例如。

module IfYourCodeIsInAModule 
    class YourGem < OtherWork 
    VERSION = "0.0.1" 
    end 
end 

當您從運行時的實際代碼中需要此文件時,這一切都很好。當您將它包含在您的gemspec中時,您突然需要require 'other_work'才能獲得您的版本號!

我很高興地去推出自己的解決方案,但是這不能成爲一個新的問題,什麼是社區做的,什麼是一般的智慧對此有何看法?

回答

1

我在寶石VERSION民族學方面的專家,但或許這個非專業知識讓我更加平均和更適合回答「一般的智慧」的問題。

所以,一般的看法是,use Bundler。一旦你通過bundle gem my_gem_name創建你的寶石,你會看到捆綁商自動創建lib/my_gem_name/version.rb文件,並要求從您的lib/my_gem_name.rb。所以我建議,如果你決定不使用捆綁,並推出對自己的自己的寶石,你還是應該保持一個獨立的version.rb文件只包含

module MyGemName 
    VERSION = "0.0.1" 
end 

也就是說,直主模塊下。然後您從lib/my_gem_name.rb加載version.rb。當然,如果你的代碼是以更加陌生的方式組織起來的,那麼你需要進一步改進。

+0

那麼,如何處理一個提供單個類的gem(它從一個依賴類中的類繼承)呢?我想你建議我將它封裝在一個模塊中,只是爲了版本控制:'module Rack;模塊MyCoolThing; VERSION =「0.0.1」;結束;結束「 - 然後在我的實際代碼中:'module Rack;模塊MyCoolThing; class MyCoolThing; def awesomes;結束;結束;結束;結束' - 這看起來很尷尬! – 2013-02-20 10:07:40

+0

@JP:這取決於你。但是在由Bundler創建的* .gemspec文件中,您可以定義與MyCoolThing :: VERSION不同的版本位置。它可以是'module Rack; class MyCoolThing; VERSION ='0.0.1'; def awesomes end end end'。在* gemspec中,你說這個版本存儲在Rack :: MyCoolThing :: VERSION下,然後你就去了。 – 2013-03-11 01:57:34

+0

正是這種情況的出現困難 - 如果'MyCoolThing'從'GiantLibrary'然後我需要聲明中的版本文件的繼承太(繼承'需要「giant_library」;模塊機架;類MyCoolThing 2013-03-11 10:55:23