当我使用具有指定版本的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
答案 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.1
,bundler
选择安装的实际版本还是“ >= 5.2.1
的最新版本。和< 5.3.0
”。
修补程序版本包含小的更改-例如较小的错误修复和安全修补程序。由于补丁程序版本的更新,您的代码会中断的情况极为罕见; 更多很有可能在更新失败时仍然容易受到安全漏洞的攻击。</ p>
因此,默认情况下,rails会安装指定版本的最新补丁程序。
如果您确实要显式还原为5.2.1
,则可以编辑Gemfile
来表示:
rails '5.2.1'
然后,重新运行bundle update
。