Прежде всего, Foo::Version
мне кажется неправильным. Это подразумевает, что версия является классом или модулем, но должна быть константой, как первые два из ваших примеров.
Кроме того, здесь нет золотого правила. Вот несколько примеров:
Рельсы
Rails::VERSION::STRING
(Примечание: модуль VERSION
со всеми прописными буквами.)
SimpleForm
SimpleForm::VERSION
Nokogiri
Nokogiri::VERSION
RSpec
RSpec::Version::STRING
(Обратите внимание, модуль Version
, сравните с Rails выше.)
Огурцы
Cucumber::VERSION
SimpleForm
SimpleForm::VERSION
Большинство из вышеперечисленных имеют свою версию, определенную в файле lib/[name]/version.rb
, за исключением Rails с version.rb
в корне проекта и Cucumber, который закопал ее в файле lib/cucumber/platform.rb
.
Также обратите внимание, что все вышеперечисленное использует String
s в качестве версии. (Rails даже объединяет MAJOR
, MINOR
, TINY
и PRE
константы в одну VERSION
константу.) Это позволяет легко сравнивать версии:
"1.2.3" > "0.4.2" # => true
"1.2.3" > "1.2.2" # => true
"1.2.3" > "1.2" # => true
Однако такое сравнение не выполняется, когда вы сталкиваетесь с двузначными числами для уровня патча:
"1.2.3" > "1.2.12" # => true
Для меня, определение Foo::VERSION
- ваша лучшая ставка, определите ее в lib/foo/version.rb
и установите значение String
.