Rush の癖

monorepo 管理するツールと言えば Lerna かなと思うが、microsoft もこれに似たツールであるRushを作っている。
検証リポジトリはここ

Lerna との比較はこの issue で議論されている。
Docs request - comparison with lerna · Issue #60 · microsoft/rushjs.io-website · GitHub

Rush のもつメリットはドキュメントのほうが詳しいのでこちらを参照
Rush: Welcome to Rush!

以下、触ってみてわかった挙動のクセを紹介。
現在の Rush の version は 5.35.1

できることはドキュメントのチュートリアルをなぞってみよう
Rush: Getting started

rush コマンドを使うために global install しないとだめ

Rush は root に package.json を置くことを意図していない。
そのため、rush コマンドを使うために global install しないといけなくなる。
npx rush initしても node_modules ありまっせっていう警告とともに終了する。

Rush はrush tyankatsu-commandみたいに自分でコマンドを作れるので、やりたいならそこになる
CI で Rush を動かしたい場合、common/scripts/install-run-rush.jsというファイル経由で@microsoft/rushを呼び出すことになる。

pnpm にやたら依存してる

Rush が pnpm を推奨してたり、設定ファイルの rush.json に pnpmOptions という項目があったりと、やたら pnpm を見かけるが、結局はrush xxxみたいに rush コマンドしか使わないのでそこまで気に気にしなくていいと思う。
yarn のあれが使いたいとかになると、一応 default の pnpm からパッケージマネージャーを pnpm、npm、yarn の中からバージョンを指定して選択する項目がある。
Rush: NPM vs PNPM vs Yarn

main/master ブランチ以外で作業したら、CHANGELOG.md に書き込みたい単位で rush change

rush.json のdefaultBranchで指定したブランチとの diff を rush change で検知して、対話モードでメッセージを書き込み、それを push して merge する。
rush publish -aでこの差分を書き込んだ json ファイルを消して changelog を生成する。
rush change と rush publish のタイミングを間違えないように気をつける。

allowedAlternativeVersions でのバージョン指定は array でのバージョン指定

ensureConsistentVersions で全ての管理パッケージでの依存パッケージのバージョンを固定できるが、その例外を allowedAlternativeVersions に書ける。
これは"ensureConsistentVersions": trueとした時、パッケージの都合で

  • PackageA で"typescript": "3.6.5"
  • PackageB で"typescript": "3.9.3"
  • PackageC で"typescript": "3.9.3"
  • PackageD で"typescript": "4.0.5"
    となっていると、普通は各バージョンが違うので警告が出るが、
common-version.json
{
  "allowedAlternativeVersions": {
    "typescript": ["3.6.5", "3.9.3"]
  }
}

と書くことで警告を回避できる。

common-version.json
{
  "allowedAlternativeVersions": {
    "typescript": ["3.x || 4.x"]
  }
}

って書くと警告が出るので、めんどくさいが一つ一つ例外のバージョンを指定する。
何をベースのバージョンとするのか(この例だと 4.0.5 をベースにした)を考える。

publish と build は CI に任せたほうが良さそう

rush publish -aで changelog 作って、commit push して、
rush publish -p -n <npmToken> --add-commit-details --include-all --set-access-level publicで npm に publish するのがとてもじゃないけど自分でやるのしんどいので、CI とか Bot に任せたほうが楽。
Rush は Bot に任せてるっぽい。
Deleting change files and updating change logs for package updates. · microsoft/rushstack@5c9000c · GitHub
Applying package updates. · microsoft/rushstack@b932d1d · GitHub

最後に

到底Documentの出来が良くなくて、重要な情報が抜けていることが多々ある。
これは逆に言えばcontributeチャンスが多いので、OSS活動をやってみたい場合はチェックしてみると良さそう。