Table of Contents

<--   Back

Monorepo Dengan PNPM Workspace


Monorepo ?

Monorepo adalah satu repository dengan banyak projek atau package (library atau module), anda bisa memakai kembali kode sabagai package.

en.wikipedia.org/wiki/Monorepo punya penjelasan bagus untuk Monorepo termasuk keuntungan dan kerugian.

FLow repo repo apps apps repo->apps pkgs pkgs repo->pkgs app1 app1 apps->app1 app2 app2 apps->app2 lib1 lib1 pkgs->lib1 lib2 lib2 pkgs->lib2

Monorepo dengan PNPM workspace

PNPM hanya perlu pnpm-workspace.yaml pada repository root disamping package.json, dengan array path ke directory dalam properti packages.

pnpm-workspace.yaml
packages:
    - "apps/*" # mendukung pola glob
    - "packages/*"
Directory Structure
monorepo-example/
├─ apps/
├─ packages/
├─ package.json
└─ pnpm-workspace.yaml

CATATAN: apps/* dan packages/* adalah struktur monorepo yang sangat populer, dimanaapps/* adalah proyek directory dan packages/* adalah kode yang dapat digunakan kembali.

Yang anda butuhkan hanya membuat directory didalam daftar packages, ganti directory, dan lakukan pnpm init.

Commands
mkdir -p packages/math-lib
cd packages/math-lib
pnpm init
cd ../..
mkdir -p apps/calculator
cd apps/calculator
pnpm init
cd ../..

Daftar semua workspaces

Daftar semua workspaces dalam format JSON.

Commands
pnpm m ls --depth -1 --json

Perintah spesifik workspace

Menjalankan perintah pada spesifik workspace menggunakan --filter dilanjutkan dengan name pada package.json.

Commands
# Format
pnpm --filter <workspace> <command>
pnpm -F <workspace> <command> # alias pendek
# Contoh
pnpm --filter math-lib add lodash
pnpm --filter math-lib add -D typescript @types/lodash
pnpm --filter calculator run test
# Mendukung pola glob
pnpm --filter pkg* run test

CATATAN: PNPM menggunakan properti name pada package.json untuk menyaring workspace, jadi pastikan semua name pada package.json itu unik.

Menambah lokal dependency

Menambah lokal dependency menggunakan flag --workspace untuk hanya tambahkan dependency baru jika ditemukan di workspace.

Commands
# Contoh
pnpm --filter calculator add math-lib --workspace

Contoh Projek

Commands
mkdir -p monorepo-example
cd monorepo-example
pnpm init
mkdir -p packages/math-lib
cd packages/math-lib
pnpm init
cd ../..
mkdir -p apps/calculator
cd apps/calculator
pnpm init
cd ../..
touch packages/math-lib/index.js
touch apps/calculator/index.js
packages/math-lib/index.js
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
 
module.exports = {
  add,
  subtract,
};
apps/calculator/index.js
const { add, subtract } = require("math-lib");
 
console.log(`9 + 10 = ${add(9, 10)}`);
console.log(`26 - 9 = ${subtract(26, 9)}`);
Commands
pnpm --filter calculator add math-lib --workspace
apps/calculator/package.json
{
  "scripts": {
    "start": "node index.js"
  }
}
package.json
{
  "scripts": {
    "calculator:start": "pnpm -F calculator run start"
  }
}
Commands
pnpm run calculator:start

output calculator run start


Open GitHub Discussions