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
していたので、これからは安心ですね。