semverとnpm
semverとは?
semver(Semantic Versioning)は依存関係のもつれを解決するべく制定されたバージョニングの標準仕様です。
Semantic Versioning 2.0.0
npmに登録されているモジュールのバージョンもsemverに沿った形式で設定されています。
The semantic versioner for npm
概要
バージョンをmajor
.minor
.patch
(-prerelease
, +build
)の形式で記述し、
それぞれインクリメントします。
node-semver
バージョンがsemverに沿ったものであるかは、npm内部でも使用されているnode-semverで確認が可能です。
$ npm install -g semver $ semver 1.01.0 # none $ semver 1.1.0 1.1.0 $ semver -i patch 1.2.3 1.2.4
依存パッケージのバージョン指定
"dependencies": { "underscore": "^1.4.4" }
npm install --save underscore
と打ったあとのpackage.json
ですが、この場合は1.4.4-0
以上、2.0.0-0
の間で最新のバージョンがインストールされます。minor
, patch
レベルのアップデートの範囲内なので、依存パッケージがsemverに従っていればエラーは起こらないことになります。
そんな事はなかった
残念ながら、意図的にしろそうでないにしろminor
やpatch
レベルのアップデートで後方互換性が破壊されるケースをしばし見かけます。少し前ですが、Backbone.jsのようなメジャーなライブラリでも後方互換性のないminor
アップデートが行われ、semverに準拠していないとして批判の声が上がっていました。
Follow SemVer #2888
そもそもの話として、major
バージョンが大きくなりすぎる事への懸念などから、厳格にsemverに従うかについては他のモジュールやnpm本体の中でも色々と議論があるようです。
まとめ
ビルドがこけたと思ったら後方互換のないpatch
レベルのアップデートが原因だった時の憤りをバネに書きました!
個人的にはmajor
バージョン大きくなってもいいからちゃんとsemverに沿っていて欲しいと思いますが、上記の議論があったり、完璧にやるのも難しい話なので、まだしばらくこうした問題は付いて回りそうですね。