2013-02-11 86 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