Edited at

Lerna(monorepo)とCHANGELOG(リリースノート)

Lernaなどのmonorepoツールを使っていて困るのが、Conventional Changelogなど既存のリリースフローがそのまま適応できない点です。

さらに、Lernaの中でも管理モードが2つありそれぞれでCHANGELOGの管理に使えるものが異なります。

Lernaでパッケージを管理する際大きく分けてFixedモードとIndependentモードがあります。


Fixedモード

管理下にあるパッケージがすべて同じバージョンとなるモード

このモードに対して使えるツールとしてlerna-changelogがあります。

BabelやJestなどが利用しています。

GitHub PRにつけたラベルを元にジャンルを分けてCHANGELOGを吐き出すツールです。


Independentモード

管理下にあるパッケージがそれぞれ異なるバージョンとなるモード

もっとも簡単な方法としてはlerna--conventional-commitsが利用できます。

Conventional Commitsに沿ったコミットメッセージを書くことで、各パッケージに自動でCHANGELOG.mdを生成してくれます。

欠点としてはlerna publish --conventional-commitsはバージョンなども自動的に決定されるためあまり柔軟性がありません。たとえばsemverで1.0.0未満などの特別扱いなどはできません。


その他

lernaはpackage@versionというタグでgit tagを付けてるようになっています。これにより既存のCHANGELOGツールの想定外の範囲となって取れてないのが殆どです。

lernaの内部的にも使ってるconventional-changeloglernaPackageというオプションでpackage@version形式に対応することができます。

たとえばつぎのようにして特定のパッケージに関するCHANGELOGを取ることができます。

$ conventional-changelog --lerna-package almin-logger

<a name="5.0.0"></a>
# 5.0.0 (2017-07-26)

* Convert almin-logger to typescript (#265) ([f4deeb7](https://github.com/almin/almin/commit/f4deeb7))
* Create CODE_OF_CONDUCT.md (#259) ([85f3636](https://github.com/almin/almin/commit/85f3636))
* Update README ([50e3359](https://github.com/almin/almin/commit/50e3359))
* Update README.md ([6d80544](https://github.com/almin/almin/commit/6d80544))
* feat(TypeScript): Add TodoMVC TypeScript (#263) ([b05f7aa](https://github.com/almin/almin/commit/b05f7aa))
* docs(almin): Add almin principle + CQRS (#262) ([47c67a3](https://github.com/almin/almin/commit/47c67a3))
* refactor(example): Update Counter example (#260) ([8c09db5](https://github.com/almin/almin/commit/8c09db5))


おわり

まだ決定版がないので、こうやってるよ的な例がもっと欲しい

追記(2019-01-26): 具体的なリリースフローがある程度まとまったので書きました