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

  • 2
    Like
  • 0
    Comment

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))

おわり

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