2013-02-11 2 views
1

Как сохранить номер версии моего кода внутри рубинового драгоценного камня?Хранение номера версии в 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. Поэтому я хотел бы предложить, что если вы решили не использовать Bundler и свернуть свой собственный драгоценный камень по своему усмотрению, вы все равно должны иметь отдельный version.rb файл, содержащий только

module MyGemName 
    VERSION = "0.0.1" 
end 

То есть, прямо под главным модулем. Затем вы загружаете version.rb от lib/my_gem_name.rb. Конечно, если ваш код организован более чужими способами, вам нужно импровизировать больше.

+0

Итак, как бы вы справились с драгоценным камнем, который поставляет один класс (который наследуется от класса внутри зависимости)? Я думаю, вы предлагаете мне обернуть его в модуле только ради управления версиями: 'module Rack; модуль MyCoolThing; VERSION = "0.0.1"; конец; end' - а затем в моем фактическом коде: 'module Rack; модуль MyCoolThing; класс MyCoolThing; def awesomes; конец; конец; конец; конец' - это кажется неудобным! –

+0

@JP: Это зависит от вас. Но в файле * .gemspec, созданным Bundler, вы можете определить другое местоположение версии, чем MyCoolThing :: VERSION. Это может быть «модульная стойка»; класс MyCoolThing; VERSION = '0.0.1'; def awesomes end end end'. И в * gemspec вы говорите, что версия хранится в Rack :: MyCoolThing :: VERSION, и вы туда. –

+0

В этой ситуации возникает трудность - если «MyCoolThing» наследуется от «GiantLibrary», тогда мне также нужно объявить это наследование в файле версии («require» giant_library »; модуль Rack; class MyCoolThing

Смежные вопросы