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-changelogはlernaPackageというオプションで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): 具体的なリリースフローがある程度まとまったので書きました