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に沿っていて欲しいと思いますが、上記の議論があったり、完璧にやるのも難しい話なので、まだしばらくこうした問題は付いて回りそうですね。