Где вы храните номер версии вашего Rails-приложения? - PullRequest
27 голосов
/ 31 января 2012

Мы используем замечательную семантическую версионность парадигму при создании версий нашего приложения rails.У меня был один вопрос: где лучше хранить этот номер?Я видел это в /lib, environment.rb и т. Д.

Просто интересно, что люди думают о лучших практиках?

Ответы [ 8 ]

43 голосов
/ 28 марта 2013

Моя стратегия состоит в том, чтобы позволить вашим тегам VCS сделать это за вас (git показан здесь).

Добавьте это к вашему application.rb:

# Only attempt update on local machine
if Rails.env.development?
  # Update version file from latest git tag
  File.open('config/version', 'w') do |file|
    file.write `git describe --tags --always` # or equivalent
  end
end

config.version = File.read('config/version')

Затем вы можете получить доступ к любой версии вашего приложения с помощью Rails.configuration.version

23 голосов
/ 01 февраля 2012

Не думаю, что для этого есть какое-то соглашение.Я думаю, это все о том, что кажется вам естественным.

В некоторых местах номер версии может быть размещен:

  • config/environment.rb
  • config/application.rb
  • config/initializers/version.rb

путем добавления:

VERSION = '1.0.0'

Независимо от того, какую опцию вы выберете (сверху), константа VERSION будет установлена ​​при инициализацииприложение.

Для своего блога я просто обновляю нижний колонтитул своего макета - так как номер версии больше нигде не используется.

Папка lib звучит немного странно, так как эта папка предназначена для хранения повторно используемых модулей.

14 голосов
/ 03 августа 2012

Я предпочитаю создать рейк-задачу, которая генерирует

# config/initializers/version.rb
VERSION = ["1", "0", "f3d9da7"]

FWIW, моя рейк-задача:

task :create_version do
  desc "create VERSION.  Use MAJOR_VERSION, MINOR_VERSION, BUILD_VERSION to override defaults"

  version_file = "#{Rails.root}/config/initializers/version.rb"
  major = ENV["MAJOR_VERSION"] || 1
  minor = ENV["MINOR_VERSION"] || 0
  build = ENV["BUILD_VERSION"] || `git describe --always --tags`
  version_string = "VERSION = #{[major.to_s, minor.to_s, build.strip]}\n"
  File.open(version_file, "w") {|f| f.print(version_string)}
  $stderr.print(version_string)
end
6 голосов
/ 17 апреля 2014

Использовать грабли для управления автоматизацией через грабли, например: https://gist.github.com/muxcmux/1805946

А затем в config / initializers / version.rb: модуль SiteInfo Приложение класса

def self.version
  "v#{self.read_version}"
end

def self.read_version
  begin
    File.read 'VERSION'
  rescue
    raise "VERSION file not found or unreadable."
  end
end
3 голосов
/ 27 февраля 2016

В Rails 4 указанная выше рейк-задача @ fearless_fool должна выглядеть следующим образом:

desc "create VERSION.  Use MAJOR_VERSION, MINOR_VERSION, BUILD_VERSION to override defaults"
task :create_version do
  version_file = "#{Rails.root}/config/initializers/version.rb"
  major = ENV["MAJOR_VERSION"] || 1
  minor = ENV["MINOR_VERSION"] || 0
  build = ENV["BUILD_VERSION"] || `git describe --always --tags`
  version_string = "VERSION = #{[major.to_s, minor.to_s, build.strip]}\n"
  File.open(version_file, "w") {|f| f.print(version_string)}
  $stderr.print(version_string)
end

Строка desc должна присутствовать и должна приходить до строки task :create...чтобы грабли узнали его.

3 голосов
/ 01 декабря 2014

Лично я предпочитаю добавлять константу в класс приложения.

# file: config/initializers/version.rb
class SomeApp::Application
  Version = '1.0.0'
end
0 голосов
/ 12 апреля 2019

Мы можем использовать git gem и создать инициализатор для установки версии нашего приложения, используя git describe

Добавьте камень git в группу разработки.

# Gemfile
# ...
group :development do
  gem 'git'
  # ...
end

Не забудьте запустить bundle.

Создать новый файл инициализатора.

# config/initializers/version.rb

if Rails.env.development?
  g = Git.open(Rails.root)
  version = g.describe
  puts "Setting application version to #{version}"
  File.write('config/VERSION', version)
end

module MyApp
  VERSION = File.read('config/VERSION').strip
end

Теперь мы можем получить доступ к версии следующим образом:

➤  rails c
Setting application version to v2.1.3-7-gd5d8ea1
Loading development environment (Rails 5.2.3)
jruby-9.2.6.0 :001 > MyApp::VERSION
 => "v2.1.3-7-gd5d8ea1" 
0 голосов
/ 01 января 2017

version.rake

def valid? version
  pattern = /^\d+\.\d+\.\d+(\-(dev|beta|rc\d+))?$/
  raise "Tried to set invalid version: #{version}".red unless version =~ pattern
end

def correct_version version
  ver, flag = version.split '-'
  v = ver.split '.'
  (0..2).each do |n|
    v[n] = v[n].to_i
  end
  [v.join('.'), flag].compact.join '-'
end

def read_version
  begin 
    File.read 'VERSION'
  rescue
    raise "VERSION file not found or unreadable.".red
  end
end

def write_version version
  valid? version
  begin
    File.open 'VERSION', 'w' do |file|
      file.write correct_version(version)
    end
  rescue
    raise "VERSION file not found or unwritable.".red
  end
end

def reset current, which
  version, flag = current.split '-'
  v = version.split '.'
  which.each do |part|
    v[part] = 0
  end
  [v.join('.'), flag].compact.join '-'
end

def increment current, which
  version, flag = current.split '-'
  v = version.split '.'
  v[which] = v[which].to_i + 1
  [v.join('.'), flag].compact.join '-'
end

desc "Prints the current application version"
version = read_version
task :version do
  puts <<HELP
Available commands are:
-----------------------
rake version:write[version]   # set custom version in the x.x.x-? format
rake version:patch            # increment the patch x.x.x+1 (keeps any flags on)
rake version:minor            # increment minor and reset patch x.x+1.0 (keeps any flags on)
rake version:major            # increment major and reset others x+1.0.0 (keeps any flags on)
rake version:dev              # set the dev flag on x.x.x-dev
rake version:beta             # set the beta flag on x.x.x-beta
rake version:rc               # set or increment the rc flag x.x.x-rcX
rake version:release          # removes any flags from the current version

HELP
  puts "Current version is: #{version.green}"
end

namespace :version do

  desc "Write version explicitly by specifying version number as a parameter"
  task :write, [:version] do |task, args|
    write_version args[:version].strip
    puts "Version explicitly written: #{read_version.green}"
  end

  desc "Increments the patch version"
  task :patch do
    new_version = increment read_version, 2
    write_version new_version
    puts "Application patched: #{new_version.green}"
  end

  desc "Increments the minor version and resets the patch"
  task :minor do
    incremented = increment read_version, 1
    new_version = reset incremented, [2]
    write_version new_version
    puts "New version released: #{new_version.green}"
  end

  desc "Increments the major version and resets both minor and patch"
  task :major do
    incremented = increment read_version, 0
    new_version = reset incremented, [1, 2]
    write_version new_version
    puts "Major application version change: #{new_version.green}. Congratulations!"
  end

  desc "Sets the development flag on"
  task :dev do
    version, flag = read_version.split '-'
    new_version = [version, 'dev'].join '-'
    write_version new_version
    puts "Version in development: #{new_version.green}"
  end

  desc "Sets the beta flag on"
  task :beta do
    version, flag = read_version.split '-'
    new_version = [version, 'beta'].join '-'
    write_version new_version
    puts "Version in beta: #{new_version.green}"
  end

  desc "Sets or increments the rc flag"
  task :rc do
    version, flag = read_version.split '-'
    rc = /^rc(\d+)$/.match flag
    if rc
      new_version = [version, "rc#{rc[1].to_i+1}"].join '-'
    else
      new_version = [version, 'rc1'].join '-'
    end
    write_version new_version
    puts "New version release candidate: #{new_version.green}"
  end

  desc "Removes any version flags"
  task :release do
    version, flag = read_version.split '-'
    write_version version
    puts "Released stable version: #{version.green}"
  end

end
...