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に従っていればエラーは起こらないことになります。

そんな事はなかった

残念ながら、意図的にしろそうでないにしろminorpatchレベルのアップデートで後方互換性が破壊されるケースをしばし見かけます。少し前ですが、Backbone.jsのようなメジャーなライブラリでも後方互換性のないminorアップデートが行われ、semverに準拠していないとして批判の声が上がっていました。
Follow SemVer #2888

そもそもの話として、majorバージョンが大きくなりすぎる事への懸念などから、厳格にsemverに従うかについては他のモジュールやnpm本体の中でも色々と議論があるようです。

まとめ

ビルドがこけたと思ったら後方互換のないpatchレベルのアップデートが原因だった時の憤りをバネに書きました!

個人的にはmajorバージョン大きくなってもいいからちゃんとsemverに沿っていて欲しいと思いますが、上記の議論があったり、完璧にやるのも難しい話なので、まだしばらくこうした問題は付いて回りそうですね。