Table of Contents
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.
Monorepo dengan PNPM workspace
PNPM hanya perlu pnpm-workspace.yaml
pada repository root disamping package.json
, dengan array path ke directory dalam properti packages
.
packages:
- "apps/*" # mendukung pola glob
- "packages/*"
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
.
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.
pnpm m ls --depth -1 --json
Perintah spesifik workspace
Menjalankan perintah pada spesifik workspace menggunakan --filter
dilanjutkan dengan name
pada package.json
.
# 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.
# Contoh
pnpm --filter calculator add math-lib --workspace
Contoh Projek
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
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
module.exports = {
add,
subtract,
};
const { add, subtract } = require("math-lib");
console.log(`9 + 10 = ${add(9, 10)}`);
console.log(`26 - 9 = ${subtract(26, 9)}`);
pnpm --filter calculator add math-lib --workspace
{
"scripts": {
"start": "node index.js"
}
}
{
"scripts": {
"calculator:start": "pnpm -F calculator run start"
}
}
pnpm run calculator:start