
npm versionコマンドの挙動がよくわからない- tagがズレた
- CHANGELOG.mdをいつコミットすればいいのか
- dist/の生成タイミング
などなど、npmパッケージのアップデートはややこしすぎます。毎回不安になるのでポイントをまとめました。
3つのポイント
- CHANGELOGをあらかじめコミットしておく
npm versionコマンド自体はgit pushしないnpm versionコマンドはnpm publishをしない
これを抑えれば、迷うことなくnpm versionできます。
そもそもなぜnpm versionを使いたいのか
npm versionは、npm-scriptsと合わせてつかったとき、次のことができます。
npm publish前のビルド忘れがなくなる- package.jsonのバージョン上げ忘れがなくなる
- タグのつけ忘れがなくなる
npm testが失敗したまま公開することがなくなる
このように、npmパッケージを公開するときに忘れがちなことを防ぐことができます。
ポイントを踏まえた最適解
まずは結論から。多分これが最適解です。
- 変更をすべてコミットする
- CHANGELOGに新バージョンの情報を加える
- CHANGELOGのみで「add changelog for vX.X.X」とコミット
$ npm version$ git push origin vX.X.X$ 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を実行すると以下のような動作をとります。
- gitワーキングディレクトリが空であることを確認。
- preversionスクリプトを実行する。このスクリプトは古いバージョンの元で実行される。デプロイ前のテストなどで使用する。
git addをpreversionスクリプトに書かない場合、生成されたファイルはコミット対象とならない。 - package.json内のバージョン情報を更新。
- versionスクリプトを実行。このスクリプトは新しいバージョンのもと実行される。
git addをversionスクリプトに書かない場合、生成されたファイルはコミット対象とならない。 - コミットしてタグをつける。
- 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していたので、これからは安心ですね。