【Node.js】lernaでMonorepoな環境を構築する

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【Node.js】lernaでMonorepoな環境を構築する

2024-9-3 |

Node.jsでlernaを使ってMonorepoな環境を構築したい!

概要

今回の記事では、Node.jsでlernaを使ってMonorepoな環境を構築する手順を掲載する。

Monorepoとは、複数のプロジェクトを単一のリポジトリで管理する方法。共通の処理があったり、複数のアプリを合わせて、1つのサービスとするような感じのプロジェクト郡の管理に

仕様書

環境

  • Node.js 20.15.0
  • npm 10.8.1
  • yarn 1.22.22
  • lerna 8.1.8

手順書

npmでもyarnでもパッケージ管理できる。yarnを使いたい場合はインストールしておく。

npm install -g yarn

lernaのプロジェクトを作るディレクトリーの中でlernaをインストールする。

npm install -d lerna

lernaでプロジェクトを初期化する。

npx lerna init

workspaceがプロジェクトだとして下記のような感じでディレクトリーとファイルが作られる。

workspace
    node_module
    .gitgnore
    lerna.json
    package-lock.json
    package.json

lerna.jsonの中身を確認する。

{
  "$schema": "node_modules/lerna/schemas/lerna-schema.json",
  "version": "0.0.0",
  "packages": [
    "packages/*"
  ]
}

パッケージの管理をyarnで行いたい場合は"npmClient": "yarn"を追加する。

{
  "$schema": "node_modules/lerna/schemas/lerna-schema.json",
  "version": "0.0.0",
  "packages": [
    "packages/*"
  ],
  "npmClient": "yarn"
}

packagespackages/*lernaで管理するプロジェクトの保管場所になるのでディレクトリーpackagesを作って、この中にプロジェクトを作ったり、移動したりする。

管理してるプロジェクト同士の依存関係の簡単な設定の例。

workspace
    packages
        main_app
        admin_app
    ...

main_appadmin_appがあって、admin_appmain_appに依存してるとする場合、はadmin_apppackage.jsondependenciesの中に"main_app": "^1.0.0"を追加する。

{
  "name": "admin_app",
  "version": "1.0.0",
  "private": true,
  ...
  "dependencies": {
    ...
    "main_app": "^1.0.0"
  },
  ...
}

tsconfig.jsonbaseUrlをいじってる場合は、pathsも編集した方が良さげ。

{
  "compilerOptions": {
    ...
    "baseUrl": "./src",
    "paths": {
      "main_app/*": ["../../main_app/src/*"]
    }
  },
}

編集が終わったら、ディレクトリーworkspaceに移動してyarn installまたはnpm installを実行するとプロジェクト間の依存関係に従って処理される。

yarn install

共通のパッケージのインストールもディレクトリーworkspaceyarnnpmを実行する。

まとめ(感想文)

メインのアプリがあって、管理アプリなどを別のプロジェクトで作る場合や共通のコードがある場合に使えるかもね!