この記事では最近自分が使ってるnpm publishでのモジュール公開のパターンについて紹介します。

npm publishで公開する先は2パターンあるので、以下の2パターンについて書きます。

  • Public
  • Private(scoped packages)

また使用するnpmはv2.7.0以上が対象です。


npm publish

先に結論的な今使ってるものを貼っておきます。 zshの関数とaliasですが、基本的にただのコマンドの組み合わせなので大体の環境で動かせる気がします。

(今後gistの方を更新するかもしれないので、記事中に書かれてるものよりgistの方が最新です)

大まかな流れは

事前準備 -> semverでコミット -> push

という感じになります。

使い方

  • npm-patch
  • npm-minor
  • npm-major
  • private-npm-patch
  • private-npm-minor
  • private-npm-major

PublicとPrivateの2種類のコマンドを後ほど話す理由で分けてますが、基本的にはpatch, minor, majorの3つのコマンドです。

見てわかるように、Semantic versioningのpatch, minor, majorに対応しています。

実行すると、依存のチェックやテスト、version変更のコミット、git tag、ビルドが必要ならnpm run build、最後にnpm publishします

function _confirm-npm(){
  echo -n "npm publish to \033[036m$1\033[0m. OK? "
  read INPUT
  echo "\033[31m=>\033[0m \033[036m$1\033[0m"
}
alias npm-patch='_confirm-npm "Public" && pre-version && npm version patch && post-version'
alias npm-minor='_confirm-npm "Public" && pre-version && npm version minor && post-version'
alias npm-major='_confirm-npm "Public" && pre-version && npm version major && post-version'
alias private-npm-patch='_confirm-npm "Private" && scoped-modules-checker && pre-version && npm version patch && post-version'
alias private-npm-minor='_confirm-npm "Private" && scoped-modules-checker && pre-version && npm version minor && post-version'
alias private-npm-major='_confirm-npm "Private" && scoped-modules-checker && pre-version && npm version major && post-version'
alias pre-version='git diff --exit-code && npm prune && npm install -q && npm test'
alias post-version='npm run --if-present build && git diff --exit-code && git push && git push --tags && npm publish'

実行されるコマンドの流れを見ていくといかのような感じになってます。

  • diffがないか
    • git diff --exit-code
  • pacakge.jsonに書いてない依存モジュールを使ってたりしないか
  • テストがちゃんと通るか
    • npm prune && npm install -q && npm test
  • semverでpackage.jsonの変更とgit tagを貼る
    • npm version <patch|minor|major>
  • ビルドスクリプトが定義されてるならビルドする
    • npm run --if-present build
    • --if-present で "build" がないなら無視できる
    • npm v2.7.0から入った機能なのでnpmが古いとだめ。
  • ビルドファイルがgitで管理されないか
    • npm run --if-present build && git diff --exit-code
  • git push
  • npm publish
    • git push && git push --tags && npm publish

npm-patch を叩くと色々チェックして、patchバージョンを上げてコミットしたものをgit pushとnpm publishしてくれる感じですね。

Privateへの公開

npm publishはパッケージがScoped packagesであるならばPrivateへ、そうでないならPublic(npmjs.com)への公開がデフォルトの挙動になっています。

具体的にはnpm publishすると以下のようなもの以外の時はPublicへ公開する挙動になります。

  1. private : true となってる
    1. package.jsonのprivate設定
  2. Scoped packages である
    1. Scoped packagesはpacakge nameが@から始まるもの
  3. publishConfigでpublish先を設定されてる
    1. package.jsonのpublishConfig設定

上記のどれかに該当する場合は、正しく設定されていればPrivateへ公開され、また設定が一部おかしかった場合もPrivateへリクエストを投げるので、Publicには漏れなくなります。

package.jsonを作るときに