๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Web

pnpm Catalog๋กœ monorepo workspace ํŒจํ‚ค์ง€ ๋ฒ„์ „ ํ†ต์ผํ•˜๊ธฐ

by LasBe 2025. 3. 23.
๋ฐ˜์‘ํ˜•

๐Ÿ“’ pnpm catalog๋กœ monorepo workspace ํŒจํ‚ค์ง€ ๋ฒ„์ „ ํ†ต์ผํ•˜๊ธฐ


์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ monorepo๋กœ ๋ฌถ์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๊ธฐ ๋งˆ๋ จ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์ž๋ฉด react, typescript, prettier, eslint, @types/.... ๋“ฑ๋“ฑ๋“ฑ

์•„๋ฌด๋ž˜๋„ ํ•˜๋‚˜์˜ workspace์—์„œ ์ค‘๋ณต๋˜๋Š” ํŒจํ‚ค์ง€๋“ค์„ ๋™์ผํ•œ ๋ฒ„์ „์œผ๋กœ ํ†ต์ผํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ชจ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š”๋ฐ์š”.

์ด๋Ÿด ๋•Œ pnpm Catalog protocol์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๊ณ ๋ฏผ๋“ค์„ ํ•œ๋ฐฉ์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ pnpm Catalog๋ž€?

pnpm Catalog๋Š” workspce ๊ธฐ๋Šฅ์œผ๋กœ, ์˜์กด์„ฑ ๋ฒ„์ „ ๋ฒ”์œ„๋ฅผ ์ •์˜ํ•ด ๋‘” ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€๋“ค์˜ ๋ฒ„์ „์„ pnpm-workspace.yaml์— catalog๋กœ ์ •์˜ํ•ด ๋‘๊ณ , ์ •์˜ํ•ด ๋‘” catalog๋Š” ๊ฐ ํ”„๋กœ์ ํŠธ package.json์˜ ํŒจํ‚ค์ง€ ๋ฒ„์ „์œผ๋กœ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

/** pnpm-workspace.yaml **/

packages:
  - "apps/*"
  - "packages/*"

catalog:
  typescript: ^5
  react: ^18
  react-dom: ^18
  "@types/react": ^18
  "@types/react-dom": ^18
/** packages/ui/package.json **/

{
  "name": "@repo/ui",
  "version": "0.0.0",
  "private": true,
  "exports": {
    "./*": "./src/*.tsx"
  },
  "scripts": {
    "...": "..."
  },
  "devDependencies": {
    "...": "...",
    "@types/react": "catalog:",
    "@types/react-dom": "catalog:",
    "typescript": "catalog:"
  },
  "dependencies": {
    "react": "catalog:",
    "react-dom": "catalog:"
  }
}

๋ฐ”๊พผ ๋ฒ„์ „์„ ์ž˜ ์ €์žฅํ•ด์ค€ ๋’ค ์ธ์Šคํ†จ ํ•ด์ฃผ๊ฒŒ ๋˜๋ฉด, ์ž๋™์œผ๋กœ pnpm-workspace.yaml์— ์ •์˜ํ•ด ๋‘” ๋ฒ„์ „์„ ์ฐธ์กฐํ•˜์—ฌ ์„ค์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

pnpm-lock.yaml ํŒŒ์ผ์„ ๋ณด๋ฉด ์„ค์น˜๊ฐ€ ์ž˜ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ Catalogs๋กœ ์—ฌ๋Ÿฌ Catalog ์ •์˜ํ•˜๊ธฐ

๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ํ•˜๋‚˜์˜ catalog๋กœ ๋ฒ„์ „์„ ํ•˜๋‚˜๋กœ ํ†ต์ผ์‹œํ‚ค์ง€ ๋ชปํ•œ๋‹ค๋ฉด Catalogs๋กœ ๋ฒ„์ „ ๋ฌถ์Œ๋“ค์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/** pnpm-workspace.yaml **/

packages:
  - "apps/*"
  - "packages/*"

catalog:
  typescript: ^5

catalogs:
  react18:
    react: ^18
    react-dom: ^18

  react19:
    react: ^19
    react-dom: ^19
{
  "name": "@example/components",
  "dependencies": {
    "react": "catalog:react18",
  }
}

์œ„์™€ ๊ฐ™์ด catalogs ์•„๋ž˜์— ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด catalog:๊ทธ๋ฃน๋ช…์œผ๋กœ ๊ฐ ๋ฒ„์ „๋“ค์„ ๋ฌถ์Œ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ์ฃผ์˜ํ•  ์ 

์ฒ˜์Œ์— catalog๋ฅผ ์ ์šฉํ•œ ํ›„ install์ด ์•ˆ๋˜์–ด ๊ธด ์‹œ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ERR_PNPM_SPEC_NOT_SUPPORTED_BY_ANY_RESOLVER typescript@catalog: isn't supported by any available resolver.

์›์ธ์„ ์ฐพ์œผ๋ ค pnpm ๊ณต์‹ ๋ฌธ์„œ์„ ํ•˜์—ผ์—†์ด ์‚ดํŽด๋ณด๋‹ค, ํ˜น์‹œ ์‹ถ์–ด ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ „๋ถ€ ํ™•์ธํ•˜๋‹ˆ pnpm v9.5 ์ด์ƒ๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ž„์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Catalog ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์˜ˆ์ •์ธ ๋ถ„๋“ค์€ pnpm update ํ˜น์€ corepack์„ ์‚ฌ์šฉํ•ด pnpm v9.5 ์ด์ƒ์œผ๋กœ ๋งž์ถฐ์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

https://pnpm.io/catalogs

 

Catalogs | pnpm

"Catalogs" are a workspace feature for defining dependency version ranges as reusable constants. Constants defined in catalogs can later be referenced in package.json files.

pnpm.io

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


์˜คํ”ˆ ์ฑ„ํŒ