12/14 追記
fileで参照するよりモノレポ管理下に置いた方が何十倍も便利でした。
その理由は3点あります。
更新が楽
プロジェクトのルートでyarn upgrade-interactive
を叩くとサンプルの依存を含めて更新できます。非常に簡単です。確認が楽
fileでの参照だと依存の依存の更新まで見ません。ですので、ライブラリを更新したのにexampleに反映されないことがあります。package.jsonが素直
lernaによりバージョンが管理されているのでライブラリのバージョンが更新されるとサンプルのバージョンも追随して更新されます。よって、file
などプロジェクトに依存している部分がなくなるので、常にサンプルのpackage.jsonがコピペ可能な状態になります。
考えられる反論としては、サンプルを入れると依存が増え開発時のインストール時間が長くなる等考えられますが、CIの時間を見るかぎり全く差はありませんでした。(むしろ時間帯によるズレが大きい)
方法
ルートのpackage.json
に以下を追記します。
"workspaces": ["packages/*", "examples/*"],
追記おわり
lernaを使い、モノレポを運用時にexamples以下もそれぞれのpackageのバージョンに縛られずに運用できると便利です。
lernaの機能で何かできないかと思いましたが、ありませんでした。
しかし、よくよく考えてみるとpackage.jsonのdependencisはfile
という書き方で相対パスでパッケージを指定出来ます。
{
"dependencies": {
"foo": "file:../../pkgs/foo"
}
}
ですので、examples以下が開発中のパッケージを参照するときは、上記のように対応することにしました。
参考までに、今開発しているs2sでは以下のように書いています。
"devDependencies": {
"enzyme": "^3.0.0",
"enzyme-adapter-react-16": "^1.0.2",
"enzyme-to-json": "^3.1.4",
"flow-bin": "^0.57.3",
"react-test-renderer": "^16.0.0",
"s2s": "*",
"s2s-plugins-redux": "file:../../packages/s2s-plugins-redux"
}
}
ここまで書いて思いましたが、別にモノレポに限った話ではないですね。
やや、モノレポそのものに惑わされた感じがします。