パッケージのスコープ化

2015/04/15よりnpmレジストリーでパッケージのスコープ化が行えるようになった。パッケージのスコープ化は名前の衝突を回避することが主な目的のような取り上げられ方だが。僕は今まで色々な理由でnpmレジストリーへは非公開にしてGitHub経由でインストールすることを推奨していたようなパターンで使うのが良さそうだという感想を持った。

"private": trueからスコープ化したパッケージへの変換は2ステップで行う。

package.jsonの更新

  • "private": trueの削除
  • nameフィールドの値へプリフィックスを追加

プリフィックスはなんでも良いようだが、通常はnpmのユーザー名を使うと良いだろう。僕は@hail2u/にしておいた。GitHubオーガニゼーション単位でスコープ化したい場合はその名前の方が良い。

公開

npmレジストリーへの公開にはオプションを追加する必要がある。特にインストールへ制限は設けないのならpublicで良い。

$ npm publish --access public

このオプションの指定は最初にnpm publishする時だけ必要になるようだ。


特にnpmパッケージ自体を非公開にしたいわけではないけれど、プライベートにすることはたまにある。それほど本気でずっと使う予定もないとか、npmレジストリーの名前を占拠したくないとか、その場合にも変な名前を付けるのも嫌だとか、環境に強く依存していて自分専用に近いものとか。

こういった半プライベートなnpmパッケージをGitHub経由でインストールする(してもらう)というアプローチは、短期的にはあまり問題ない。しかしインストールはやはり遅く、特にCI環境下では致命的といえる。また、バージョン指定が特殊で面倒な感じになりやすい。そのため常に最新版を使うような運用にしてしまいがちで、あっと思ったら環境が壊れたということになりうる(やった)。

スコープ化しておくと通常のnpmパッケージとほとんど変わらず扱える。運用も同じように行うことになるので、GitHub経由特有の問題からは解放され、npmレジストリーとnpmパッケージそのものの問題に集約されることになる。問題が減るわけではないが、少なくとも問題の原因は減るので、その究明は楽になるだろう。