TL; DR
是的,使用悲观锁定(~>
)并指定语义版本以修补(Major.minor.patch
)您所有宝石!
讨论区
我对这个问题缺乏明确性感到惊讶,即使是“行业专家”前几天告诉我,Gemfile.lock
在那里也可以维护gem版本。错误!
您希望以Gemfile
一种可以随时运行bundle update
而又不会破坏所有内容的方式来组织您的工作。要达到此目的:
为所有具有悲观锁定的宝石指定补丁程序级别的版本。这样可以bundle update
为您提供修复,但不能破坏更改。
ref
为git指定宝石
此设置的唯一弊端是,当出现甜美的次要/主要版本的宝石时,您必须手动提高版本。
警告情况
考虑一下如果不锁定宝石会发生什么。
您gem "rails"
的gemfile中已解锁,版本Gemfile.lock
为4.1.16
。您正在编码,并且在某个时候执行bundle update
。现在,您的Rails版本跳至5.2.0
(如果提供了其他宝石不能阻止这种情况),一切都会中断。
帮自己一个忙,不要让它成为任何宝石!
一个示例Gemfile
if (version = Gem::Version.new(Bundler::VERSION)) < Gem::Version.new('1.16.3')
abort "Bundler version >= 1.16.3 is required. You are running #{version}"
end
source "http://rubygems.org"
gem "entity_validator",
git: "https://github.com/plataformatec/devise",
ref: "acc45c5a44c45b252ccba65fd169a45af73ff369"
gem "rails", "5.1.5"
gem "newrelic_rpm", "~> 4.8.0"
gem "puma", "~> 3.12.0"
group :test do
gem "simplecov", "~> 0.16.1", require: false
end
一个让步
如果您确信测试会捕获由gem版本更改引入的错误,则可以尝试在次要版本而不是补丁中悲观地锁定gem。
这将使gem版本在指定的主要版本之内增加,但绝不会增加到下一个版本。
gem "puma", "~> 3.12"