Where do you store your Rails Application's version number?

前端 未结 8 1732
终归单人心
终归单人心 2021-01-30 05:41

We use the wonderful semantic versioning paradigm when versioning our rails app. One question I had was where is it best to store this number? I\'ve seen it stored in /l

相关标签:
8条回答
  • 2021-01-30 05:55

    We can use the git gem and create an initializer to set our application version using git describe

    Add the git gem to the development group.

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

    Don't forget to run bundle.

    Create a new initializer file.

    # 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
    

    Now we can access the version like so:

    ➤  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 讨论(0)
  • 2021-01-30 05:57

    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
    
    0 讨论(0)
  • 2021-01-30 05:58

    In Rails 4, @fearless_fool's rake task above needs to look like this:

    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
    

    The desc line must be present and must come before the task :create... line in order for rake to recognize it.

    0 讨论(0)
  • 2021-01-30 06:00

    Use rake task for automation control via rake, for exampe: https://gist.github.com/muxcmux/1805946

    And then in config/initializers/version.rb: module SiteInfo class Application

    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
    
    0 讨论(0)
  • 2021-01-30 06:11

    I don't really think there's any convention for this. I guess it's all about what seems natural to you.

    Some places the version number can be placed are in:

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

    by adding:

    VERSION = '1.0.0'
    

    Regardless of which option you choose (from above) - the VERSION constant will be set at the initialization of the app.

    For my blog I just update the footer of my layout - as the version number isn't used anywhere else.

    The lib-folder does sound a bit strange though, as this folder is meant to store re-usable modules.

    0 讨论(0)
  • 2021-01-30 06:11

    My preference is to create a rake task that generates

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

    FWIW, my rake task:

    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
    
    0 讨论(0)
提交回复
热议问题