曖昧なバージョン指定を辞めよう
ちゃんと動作を保証できるバージョンを書こう
無駄に範囲の広いバージョン指定をやめよう
(業務でLaravelやらRailsを使っていて、複数バージョンでの動作を保証したいことはないでしょ?)
composerを例に話を進める
プログラミング言語付随のパッケージマネージャーで、パッケージのインストールコマンドをバージョン指定なしでたたくと、おおむね以下のような曖昧な指定になる
code:composer.json
{
"require": {
"package": "^1.2.3"
}
}
これは、packageの1.2.3から2.0.0より小さいバージョン全てを許容するという書き方になっている
インストールタイミングによっては1.2.3が選ばれるかもしれないし、1.99.9が選ばれるかもしれない
が、あなたのソフトウェアはこの範囲に含まれるすべてのバージョンで動作することを保証するだろうか?
おそらくそんなことはほとんどなく、パッケージを依存に追加したときの最新バージョンを使いたいといったところだろう
(そしてこの場合、マイナーバージョンか、もっと言うとメジャーバージョンだけを気にしてインストールした、というのが大半だろう)
Q. メジャーバージョンが上がってないならいいんじゃない?
A. 開発者がSemantic Versioningに従っている保証はない。従っていたとしても、ちょっとパッチバージョンを上げたタイミングで意図せず壊れる可能性は十二分にある。
Q. lockファイルがあればいいでしょ?
A. 動作保証のできないバージョンを許容するべきではない。最初からちゃんと自分が動作を保証できるバージョンを正しく指定しよう。
(これは別の問題ではあるが、パッケージマネージャーによってはlockファイルの無視が標準の挙動で、lockファイルを見るのが別コマンド/オプションのものもある(e.g. npm installと npm ci)。これを知らずにバージョンが変わることもあり得る。)