โ† ๋ชจ๋“  ๊ธ€

pnpm

PNPM v10 braking changes

๋ณธ ๊ธ€์€ PNPM ๋ฌธ์„œ์™€ ์กฐ์‚ฌํ•œ ์ž๋ฃŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ claud.ai๊ฐ€ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค

2025.02.112 min read

๋ณธ ๊ธ€์€ PNPM ๋ฌธ์„œ์™€ ์กฐ์‚ฌํ•œ ์ž๋ฃŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ claud.ai๊ฐ€ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค

๋“ค์–ด๊ฐ€๋ฉฐ

PNPM v10์—์„œ ๊ฐ€์žฅ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” ํŒจํ‚ค์ง€ ํ˜ธ์ด์ŠคํŒ… ์ •์ฑ…์˜ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ v10์—์„œ์˜ ํ˜ธ์ด์ŠคํŒ… ๋™์ž‘ ๋ฐฉ์‹ ์ฐจ์ด๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ , ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PNPM์˜ ๊ธฐ๋ณธ ์ฒ ํ•™: Strictํ•œ ๊ฒฉ๋ฆฌ

PNPM์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—„๊ฒฉํ•œ ํŒจํ‚ค์ง€ ๊ฒฉ๋ฆฌ๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

  1. ๋ชจ๋“  ์˜์กด์„ฑ์€ node_modules/.pnpm ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ
  2. ๊ฐ ํŒจํ‚ค์ง€๋Š” package.json์— ๋ช…์‹œ๋œ ์ง์ ‘์ ์ธ ์˜์กด์„ฑ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  3. Symlink๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์—ฐ๊ฒฐ

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” node_modules ์ง€์˜ฅ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์œ„ํ—˜์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

v9๊นŒ์ง€์˜ ํ˜ธ์ด์ŠคํŒ… ์ •์ฑ…

์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜(DX)์„ ์œ„ํ•ด ํŠน์ • ํŒจํ‚ค์ง€๋“ค์— ๋Œ€ํ•ด ์ž๋™ ํ˜ธ์ด์ŠคํŒ…์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

text
node_modules
โ”œโ”€โ”€ .pnpm/          # ์‹ค์ œ ํŒจํ‚ค์ง€๋“ค์ด ์ €์žฅ๋˜๋Š” ์œ„์น˜
โ”œโ”€โ”€ eslint/         # ์ž๋™์œผ๋กœ ํ˜ธ์ด์ŠคํŒ…๋œ eslint
โ”œโ”€โ”€ prettier/       # ์ž๋™์œผ๋กœ ํ˜ธ์ด์ŠคํŒ…๋œ prettier
โ””โ”€โ”€ your-project/   # ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ

์ž๋™ ํ˜ธ์ด์ŠคํŒ…๋˜๋Š” ํŒจํ‚ค์ง€๋“ค

  • ESLint ๊ด€๋ จ ํŒจํ‚ค์ง€
  • Prettier ๊ด€๋ จ ํŒจํ‚ค์ง€
  • ์ผ๋ถ€ ๊ฐœ๋ฐœ ๋„๊ตฌ

์ด๋Š” VSCode ๋“ฑ์˜ IDE์—์„œ ํฌ๋งทํ„ฐ๋‚˜ ๋ฆฐํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

v10์˜ ๋ณ€๊ฒฝ๋œ ํ˜ธ์ด์ŠคํŒ… ์ •์ฑ…

v10์—์„œ๋Š” ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ์ž๋™ ํ˜ธ์ด์ŠคํŒ…์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

text
node_modules
โ””โ”€โ”€ .pnpm/          # ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ์ด๊ณณ์—๋งŒ ์ €์žฅ๋จ

์ด์ œ๋Š” ๋ชจ๋“  ํ˜ธ์ด์ŠคํŒ…์ด ๋ช…์‹œ์ ์ธ ์„ค์ •์„ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:

json
{
  "pnpm": {
    "public-hoist-pattern": [
      "*eslint*",
      "*prettier*",
      "@types/*",
      "typescript"
    ]
  }
}

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ

1. ํ•„์š”ํ•œ ๋„๊ตฌ ํŒŒ์•…ํ•˜๊ธฐ

๋จผ์ € ํ”„๋กœ์ ํŠธ์—์„œ ํ˜ธ์ด์ŠคํŒ…์ด ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค:

  • IDE ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”๋กœ ํ•˜๋Š” ํŒจํ‚ค์ง€
  • ๊ธ€๋กœ๋ฒŒ ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๊ฐœ๋ฐœ ๋„๊ตฌ
  • TypeScript ๊ด€๋ จ ํŒจํ‚ค์ง€

2. package.json ์„ค์ •ํ•˜๊ธฐ

json
{
  "pnpm": {
    "public-hoist-pattern": [
      // ๋ฆฐํ„ฐ/ํฌ๋งทํ„ฐ
      "*eslint*",
      "*prettier*",

      // TypeScript
      "@types/*",
      "typescript",

      // ๊ธฐํƒ€ ๊ฐœ๋ฐœ ๋„๊ตฌ
      "*webpack*",
      "*babel*"
    ],
    // ํ˜ธ์ด์ŠคํŒ…๋œ ํŒจํ‚ค์ง€์˜ ์ค‘๋ณต ์„ค์น˜ ๋ฐฉ์ง€
    "shamefully-hoist": false
  }
}

๋ณ€๊ฒฝ์˜ ์˜๋ฏธ

์ด๋ฒˆ ๋ณ€๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

  1. ๋ณด์•ˆ ๊ฐ•ํ™”: ์˜๋„ํ•˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€ ์ ‘๊ทผ์„ ์›์ฒœ ์ฐจ๋‹จ
  2. ๋ช…์‹œ์„ฑ ์ฆ๊ฐ€: ํ˜ธ์ด์ŠคํŒ…์ด ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋ช…ํ™•ํžˆ ๋ฌธ์„œํ™”
  3. ์˜์กด์„ฑ ๊ด€๋ฆฌ ๊ฐœ์„ : ์ž ์žฌ์ ์ธ ์ถฉ๋Œ๊ณผ ๋ฒ„์ „ ๋ถˆ์ผ์น˜ ๋ฐฉ์ง€

๋งˆ์น˜๋ฉฐ

PNPM v10์˜ ํ˜ธ์ด์ŠคํŒ… ์ •์ฑ… ๋ณ€๊ฒฝ์€ ๋‹จ๊ธฐ์ ์œผ๋กœ๋Š” ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•œ ๋ถˆํŽธํ•จ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ๋” ์•ˆ์ „ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ์—์„œ ์ด๋Ÿฌํ•œ ์—„๊ฒฉํ•œ ๊ด€๋ฆฌ๋Š” ํฐ ์ด์ ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ PNPM v10 Braking changes๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.