【问题标题】:Where do you store your Rails Application's version number?您将 Rails 应用程序的版本号存储在哪里?
【发布时间】:2012-02-22 19:29:42
【问题描述】:

在对我们的 rails 应用程序进行版本控制时,我们使用了出色的 semantic versioning 范例。我的一个问题是最好将这个号码存储在哪里?我已经看到它存储在/libenvironment.rb 等中。

只是想知道人们对最佳实践的看法?

【问题讨论】:

    标签: ruby-on-rails versioning semantic-versioning


    【解决方案1】:

    我真的不认为有任何约定。我想这都是关于你觉得很自然的事情。

    一些可以放版本号的地方是:

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

    通过添加:

    VERSION = '1.0.0'
    

    无论您选择哪个选项(从上面) - VERSION 常量将在应用初始化时设置。

    对于我的博客,我只更新了布局的页脚 - 因为版本号不用于其他任何地方。

    lib-文件夹听起来有点奇怪,因为这个文件夹是用来存储可重用模块的。

    【讨论】:

    • 不应该是:VERSION = '1.0.0'
    【解决方案2】:

    我的偏好是创建一个生成的 rake 任务

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

    FWIW,我的 rake 任务:

    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
    

    【讨论】:

      【解决方案3】:

      我的策略是让您的 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 在应用中的任何位置访问该版本

      【讨论】:

      • 显而易见的警告是,您必须在添加新标签后启动您的应用程序,以使其在部署之前保持最新。我看到这总是一个过时的版本。
      【解决方案4】:

      使用 rake 任务通过 rake 进行自动化控制,例如:https://gist.github.com/muxcmux/1805946

      然后在 config/initializers/version.rb 中: 模块站点信息 类应用

      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
      

      【讨论】:

      • 非常好用的 rake 任务。这个答案是最好的:)
      • 我认为我个人在这里所做的唯一改变就是记住它
      【解决方案5】:

      我个人更喜欢在应用程序类中添加一个常量。

      # file: config/initializers/version.rb
      class SomeApp::Application
        Version = '1.0.0'
      end
      

      【讨论】:

        【解决方案6】:

        在 Rails 4 中,@fearless_fool 上面的 rake 任务需要如下所示:

        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... 行之前,以便 rake 识别它。

        【讨论】:

          【解决方案7】:

          版本.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
          

          【讨论】:

          • 我将如何在我的 Rails 应用程序中显示生成的和后续更新的版本?
          【解决方案8】:

          我们可以使用git gem 并创建一个初始化程序来使用git describe 设置我们的应用程序版本

          git gem 添加到开发组。

          # 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" 
          

          【讨论】:

            猜你喜欢
            • 2016-04-18
            • 2012-06-27
            • 1970-01-01
            • 1970-01-01
            • 2010-11-03
            • 1970-01-01
            • 2013-11-20
            • 2021-05-03
            • 2011-09-01
            相关资源
            最近更新 更多