npm version でできること
Tags: npm, node, git
Published: 2019-10-22 00:40:16

最近 `npm version` というコマンドを教えてもらいました。
npm は Node.js のバージョン管理ツールで、`npm install` くらいしか使っていないので、こういう使い方があるんだぁと感心しました。そもそもこのコマンド自体を教えてもらって初めて知りました。
ここでは、`npm version` の使い方を紹介します(解説は[公式ドキュメント](https://docs.npmjs.com/cli/version)を元に行います)。

## npm version

今手元の環境で `npm version` を実行すると以下のような出力が得られます。

```
$ npm version
{
  npm: '6.9.0',
  ares: '1.15.0',
  brotli: '1.0.7',
  cldr: '35.1',
  http_parser: '2.8.0',
  icu: '64.2',
  llhttp: '1.1.1',
  modules: '72',
  napi: '4',
  nghttp2: '1.38.0',
  node: '12.1.0',
  openssl: '1.1.1b',
  tz: '2019a',
  unicode: '12.1',
  uv: '1.28.0',
  v8: '7.4.288.21-node.16',
  zlib: '1.2.11'
}
```

### バージョンの更新

`npm version` は、サブコマンドで以下のものを渡して実行することでバージョンをインクリメントすることができます。

[Vue.js](https://github.com/vuejs/vue) のリポジトリを手元にダウンロードしてきてリポジトリのルートで実行してみます。

```
$ npm version
{
  vue: '2.6.10',
  npm: '6.9.0',
  ares: '1.15.0',
  brotli: '1.0.7',
  cldr: '35.1',
  http_parser: '2.8.0',
  icu: '64.2',
  llhttp: '1.1.1',
  modules: '72',
  napi: '4',
  nghttp2: '1.38.0',
  node: '12.1.0',
  openssl: '1.1.1b',
  tz: '2019a',
  unicode: '12.1',
  uv: '1.28.0',
  v8: '7.4.288.21-node.16',
  zlib: '1.2.11'
}
```

Git リポジトリ内でじっこうすること、先程のものから `package.json` に記載したパッケージのバージョンの表記も追加されています。

このバージョンをインクリメントすることができます。
バージョンの仕様は [semver](https://semver.org/lang/ja/) に準拠していて、対象のバージョンナンバーを指定して以下のように実行します(引き続き Vue.js のリポジトリで行っています)。

```
$ npm version patch
v2.6.11
```

バージョン情報を出力してみると:

```
$ npm version
{
  vue: '2.6.11',
  npm: '6.9.0',
  ares: '1.15.0',
  brotli: '1.0.7',
  cldr: '35.1',
  http_parser: '2.8.0',
  icu: '64.2',
  llhttp: '1.1.1',
  modules: '72',
  napi: '4',
  nghttp2: '1.38.0',
  node: '12.1.0',
  openssl: '1.1.1b',
  tz: '2019a',
  unicode: '12.1',
  uv: '1.28.0',
  v8: '7.4.288.21-node.16',
  zlib: '1.2.11'
}
```

バージョンのインクリメント以外に、Gitのコミット、タグ付けも行われているので確認してみます。

```
$ git log
commit 2a5fabccf2199ba09ac5f32f0b73df0bca5462be (HEAD -> dev, tag: v2.6.11)
Author: tokuda109 <example@gmail.com>
Date:   Tue Oct 22 09:32:58 2019 +0900

    2.6.11

... (省略)
```

コミット履歴があります。
コミットメッセージを指定する場合は以下のようにします。

```
$ npm version patch -m "Upgrade to %s for reasons"
v2.6.11
```

`%s` の部分にバージョンが展開されてコミットされます。

```
$ git log
commit 8762348dfa78e420314158c14530fd43241e7d29 (HEAD -> dev, tag: v2.6.11)
Author: tokuda109 <example@gmail.com>
Date:   Tue Oct 22 09:38:51 2019 +0900

    Upgrade to 2.6.11 for reasons

```

以下を実行してタグの一覧を確認してみます。

```
$ git tag
0.10.0-rc
0.11.0
... (省略)
v2.6.10
v2.6.11
... (省略)
```

タグ付けもされていることが確認できました。

次にメジャーバージョンを上げてみます。

```
$ npm version major
v3.0.0
```

再度バージョン情報を出力してみると:

```
$ npm version
{
  vue: '3.0.0',
  npm: '6.9.0',
  ares: '1.15.0',
  brotli: '1.0.7',
  cldr: '35.1',
  http_parser: '2.8.0',
  icu: '64.2',
  llhttp: '1.1.1',
  modules: '72',
  napi: '4',
  nghttp2: '1.38.0',
  node: '12.1.0',
  openssl: '1.1.1b',
  tz: '2019a',
  unicode: '12.1',
  uv: '1.28.0',
  v8: '7.4.288.21-node.16',
  zlib: '1.2.11'
}
```

期待どおりの動作をしていることが確認できました。

今回紹介した以外にも以下のバージョンナンバーを指定してインクリメントすることができます。

* major (`v2.6.10` -> `v3.0.0`)
* minor (`v2.6.10` -> `v2.7.0`)
* patch (`v2.6.10` -> `v2.6.11`)
* premajor (`v2.6.10` -> `v3.0.0-0`)
* preminor (`v2.6.10` -> `v2.7.0-0`)
* prepatch (`v2.6.10` -> `v2.6.11-0`)

### npm version prerelease

`npm version prerelease` は `premajor`、`preminor`、`prepatch` によって付与されたプレリリースバージョンをインクリメントするためのサブコマンドです。

```
$ npm version prepatch
v2.6.11-0
```

次に以下のように実行してみます:

```
$ npm version prerelease
v2.6.11-1
```

## 参考

* [npm-version](https://docs.npmjs.com/cli/version)
* [セマンティック バージョニング](https://semver.org/lang/ja/)
* [npm versionコマンドで出来ること。 - Qiita](https://qiita.com/minamo173/items/8b8b27bc6ecd17ad925e)