Panda Noir

JavaScript の限界を究めるブログでした。最近は幅広めに書いてます。

これでもう怖くない!npm versionで失敗しないための3つのポイント

f:id:panda_noir:20180213024939p:plain

  • npm versionコマンドの挙動がよくわからない
  • tagがズレた
  • CHANGELOG.mdをいつコミットすればいいのか
  • dist/の生成タイミング

などなど、npmパッケージのアップデートはややこしすぎます。毎回不安になるのでポイントをまとめました。

3つのポイント

  1. CHANGELOGをあらかじめコミットしておく
  2. npm versionコマンド自体はgit pushしない
  3. npm versionコマンドはnpm publishをしない

これを抑えれば、迷うことなくnpm versionできます。

そもそもなぜnpm versionを使いたいのか

npm versionは、npm-scriptsと合わせてつかったとき、次のことができます。

  1. npm publish前のビルド忘れがなくなる
  2. package.jsonのバージョン上げ忘れがなくなる
  3. タグのつけ忘れがなくなる
  4. npm testが失敗したまま公開することがなくなる

このように、npmパッケージを公開するときに忘れがちなことを防ぐことができます

ポイントを踏まえた最適解

まずは結論から。多分これが最適解です。

  1. 変更をすべてコミットする
  2. CHANGELOGに新バージョンの情報を加える
  3. CHANGELOGのみで「add changelog for vX.X.X」とコミット
  4. $ npm version
  5. $ git push origin vX.X.X
  6. $ npm publish

npm scriptsはこんな感じです。

{
  "scripts": {
    "preversion": "yarn-or-npm test",
    "version": "yarn-or-npm run build && git add -A",
    "postversion": "git push && git push --tags"
  }
}

versionにてgit add -Aとしていますが、versionで生成するファイルをgitで管理していない場合は不要です。

npm versionの動作詳細

解説のためにまず動作詳細について書きます。npm versionを実行すると以下のような動作をとります。

  1. gitワーキングディレクトリが空であることを確認。
  2. preversionスクリプトを実行する。このスクリプトは古いバージョンの元で実行される。デプロイ前のテストなどで使用する。git addをpreversionスクリプトに書かない場合、生成されたファイルはコミット対象とならない。
  3. package.json内のバージョン情報を更新。
  4. versionスクリプトを実行。このスクリプトは新しいバージョンのもと実行される。git addをversionスクリプトに書かない場合、生成されたファイルはコミット対象とならない。
  5. コミットしてタグをつける。
  6. postversionを実行する。

ちなみにコミットメッセージは-m--messageで変更できます。指定しなかった場合、「vX.X.X」というメッセージになります。

コミットの対象ファイルは(preversionとversionで指定がなければ)package.jsonのみとなります。

ポイントその1: CHANGELOGをあらかじめコミットしておく

CHANGELOG.mdの変更をnpm versionの前にするか、後にするか迷いますよね。

しかし、npm versionすると自動でタグ付けが行われます。そのため、CHANGELOG.mdの変更をnpm version後にしてしまうと、タグ付けしたコミットにCHANGELOG.mdの変更が入りません。なので、npm versionの前にCHANGELOG.mdを更新することをオススメします。

ちなみに、angularはpackage.jsonのバージョンを上げたコミットのあとにタグ付でCHANGELOG.mdを更新しています。npm versionを使ってこれはできないので、おそらく手動で行っているのだと思います。

ポイントその2: git pushはデフォルトでは行われない

npm publishを解説するページに書いてあるnpm scriptsにgit pushが含まれることが多いので勘違いしがちですが、npm version自体は「vX.X.Xというコミットをする・タグをつける」だけです。git pushはデフォルトでは行われません。

今まで「npm versionしたら勝手にgit pushされてしまった…修正ができない(泣)」と痛い目を見てきた方はとりあえずpostversionからgit pushを外してください。npm versionそのものはgit pushしないのでこれで安心して失敗できます(?)。

ポイントその3: npm publishは手動でしなければならない

npm versionはなんとなくnpm publishもしてくれると思いがちですが、自動で行われません。何度も書きますが、npm versionは「package.jsonのバージョンを上げてコミット・タグ付けするだけ」です。そのため、npm versionのあとに手動でnpm publishをしなければなりません。

終わりに

今まで不安と戦いながらnpm versionしていたので、これからは安心ですね。