Rush というのは、Microsoft社製のモノレポ管理ツールです。モノレポは、モノリポジトリの略です。単一のリポジトリ内で、複数の Node Packageを管理していく手法を指します。
例えば、フロントエンドとバックエンドの2つのパッケージを一つのリポジトリ内で管理したり、いくつかのパッケージと共通のライブラリを別パッケージにして単一のリポジトリにて管理する利用例があります。
僕自身は、Nx: Extensible Dev Tools for Monorepos というモノレポツールを使ってきましたが、ちょっとパッケージ構成が利用用途と合わず、乗り換え先を探していたのでした。
また、この1年くらい、開発環境がWindowsを主力になってきたのもあって、自宅のメインPCもMacからWindowsに乗り換えをしているところです。ということもあって、Microsoft製というのはなかなか興味深いです。
Rush のサイトは、一見するとMicrosoftらしからぬテイストでデザインされていますが、スクロールをしていくと、どこでRushが使われているかが利用アイコンと共にならべられており、ビジネスユーザーがよく使うであろうSharePointなどでも使われているということが伺えます。
Rushの具体的な利用方法は、ドキュメントを読み解けばわかりますが、こういうのをはじめて使う人にはとっつきにくいものであると感じたので(実際僕も構成が最初はよくわかりませんでした)、ちょっと全体的な概念を書いてみます。
Rushを使った場合のリポジトリの構成
Rushを使う場合、複数のパッケージがリポジトリに含まれるので、こんな感じになります(細かなファイルは割愛します)
- common/
- packages/
- package_A/
- src/
- package.json
- node_modules
- package_B/
- src/
- package.json
- node_modules
- package_A/
- rush.json
上から順に説明をすると、common
というのは、Rushが自動生成をするディレクトリです。依存管理されたパッケージの実体ファイルに加え、パッケージマネージャの設定などが入ります。
packages
というディレクトリは、これは名前はなんでもいいのですが、自分のパッケージを格納するディレクトリです。この中に従来のパッケージを格納していきます。package.json
がそれぞれあるのがわかると思います。node_modules
といういつもの依存パッケージを格納するディレクトリもありますが、フォルダの中にあるパッケージファイルは実体ではなく、Rushが自動で作成したシンボリックリンクです。実体はcommon
ディレクトリのtemp
以下にあります。
ちなみに、common
ディレクトリは、init
コマンドを実行した際に作成されます。
$ rush init
ちょうど、新規npmパッケージを作成するのと同じような感じでモノレポを作成できるわけです。
各自前パッケージを配置した際には、rush.json
を編集して、update
コマンドを実行するようにしましょう。
{
...
"projects": [
{
"packageName": "package_A",
"projectFolder": "packages/package_A"
},
...
],
...
}
各パッケージへの依存パッケージの追加の方法
次に、パッケージ内で、依存パッケージを追加する方法を書いてみます。各パッケージ内で、add
コマンドをつかうことで、依存パッケージを追加することができます。こんな感じです。
$ cd packages/package_A
$ rush add -p react
これで、package.json
が更新されると共に、Rush内の全体的な依存管理情報も更新されます。
ちなみに、こういうような書きかたはできないようです。
$ rush add -p react react-dom
この問題については、以下のIssueで検討が進行中です。
ARTICLES
AUTHOR

原 一浩
カンソクインダストリーズ代表 / グレーティブ合同会社代表
1998年に独立し、同年、ウェブデザイン専門のメールメディア DesignWedgeの発行を開始。Webデザイン業の傍ら、海外のWebデザインに関する情報発信を行う。
雑誌への寄稿多数。主な著書に『はじめてのフロントエンド開発』『プロセスオブウェブデザイン』、『Play framework徹底入門』、『ウェブデザインコーディネートカタログ』など。自社製のWebデザインのクロール&キャプチャシステムvaqumをベースに、様々なリサーチを行っている。Web 検定プロジェクトメンバー。