创建应用程序时,Rails不遵循指定的版本

时间:2018-12-06 11:25:26

标签: ruby-on-rails ruby

当我使用具有指定版本的rails创建应用程序时,即使Gemfile写入5.2.1,它也会在Gemfile.lock文件中升级到5.2.2时,这都不兑现

这就是我所做的

gem install rails -v 5.2.1

rails _5.2.1_ new backend-solidus -d postgresql

但是在安装日志中,这显示:

Fetching rails 5.2.2
Installing rails 5.2.2

完整的日志文件: https://pastebin.com/qC6d2wws

1 个答案:

答案 0 :(得分:4)

这是故意的;这是设计使然。

Here is the relevant source code,从当前的rails主分支开始:

  def rails_gemfile_entry
    if options.dev?
      [
        GemfileEntry.path("rails", Rails::Generators::RAILS_DEV_PATH)
      ]
    elsif options.edge?
      [
        GemfileEntry.github("rails", "rails/rails")
      ]
    else
      [GemfileEntry.version("rails",
                        rails_version_specifier,
                        "Bundle edge Rails instead: gem 'rails', github: 'rails/rails'")]
    end
  end

  def rails_version_specifier(gem_version = Rails.gem_version)
    if gem_version.segments.size == 3 || gem_version.release.segments.size == 3
      # ~> 1.2.3
      # ~> 1.2.3.pre4
      "~> #{gem_version}"
    else
      # ~> 1.2.3, >= 1.2.3.4
      # ~> 1.2.3, >= 1.2.3.4.pre5
      patch = gem_version.segments[0, 3].join(".")
      ["~> #{patch}", ">= #{gem_version}"]
    end
  end

尤其要注意~>运算符。

使用此方法意味着,即使您的Gemfile将指定版本~> 5.2.1bundler选择安装的实际版本还是“ >= 5.2.1的最新版本。和< 5.3.0”。

修补程序版本包含小的更改-例如较小的错误修复和安全修补程序。由于补丁程序版本的更新,您的代码会中断的情况极为罕见; 更多很有可能在更新失败时仍然容易受到安全漏洞的攻击。<​​/ p>

因此,默认情况下,rails会安装指定版本的最新补丁程序


如果您确实要显式还原为5.2.1,则可以编辑Gemfile来表示:

rails '5.2.1'

然后,重新运行bundle update