npmのd*ependenciesでの~と^

npmではv1.4.3からデフォルトでは^を使ったバージョン指定でインストールした依存パッケージをpackage.jsonへ保存するようになった。後方互換性が確保されているはずなので、マイナーまでは無言で更新して良いということなのだろう。ただ、他からプラグイン的に利用されることを(も)想定しているNode.jsパッケージでは~の方が良いのかもしれないと思った。

例えばGruntのプラグインなどだ。PostCSSのプロセッサーとしても使えるNode.jsパッケージもそう。これらは^でもそれ自体の後方互換性は維持されるわけだが、その上流との互換性はdependenciesでは解決できない。もちろんpeerDependenciesがそのためにできたので、きちんと使えばうまく機能するはずだ。しかし、それは動作が保証されるというだけにすぎない。

ここで~を使い互換性のある変更すらも排除したバージョン範囲に固定しておくと、動作のような曖昧なものではなく機能ベースで使うNode.jsパッケージの性格を固定できる。

互換性を確保したまま機能追加されたけど、その変わり別の機能の速度が落ちたなどということはよくある。特に将来的に削除する予定になってしまった機能ではありがちだろう。そういった機能の面での変更はsemverでは表現できないので、~のような機能性をもフリーズさせるであろう範囲に絞っておくというのは、プラグイン的に利用されるものでは効果的なのではないか。