๋ฃจํŠธ ๋‹จ์ผ ์„ค์น˜ vs ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ค์น˜

ํšŒ์‚ฌ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ Yarn์„ ์“ฐ๊ณ  ์žˆ๊ณ , ์ผ๋ ‰ํŠธ๋ก  ๊ตฌ์กฐ๋ผ์„œ ๊ฐ๊ฐ์˜ ๋ Œ๋”๋Ÿฌ์— ๋ชจ๋‘ ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด, ๋ฃจํŠธ์—๋งŒ ๋‘๊ณ  ํ•˜์œ„ ์›Œํฌ์ŠคํŽ˜์ด์Šค์—์„œ peerDependencies๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๋‚˜๋„ ํ™•์‹ ์ด ์—†์–ด์„œ ๊ด€๋ จ๋œ ๋‚ด์šฉ๋“ค์„ ์ฐพ์•„๋ณด์•˜๋‹ค.
( + ์ „ ํšŒ์‚ฌ์—์„œ๋Š” ๋ฃจํŠธ์—์„œ override๋กœ ํ†ต์ œํ•˜๋Š” ์‹์œผ๋กœ ์ผ๋Š”๋ฐ, ์ง€๊ธˆ ํšŒ์‚ฌ์™€์˜ ๋‹ค๋ฅธ ๊ตฌ์กฐ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์–ด ํ™•์‹ ์ด ์—†๊ธฐ๋„ ํ–ˆ๋‹ค.)

๊ฒฐ๋ก 

์ดˆ๊ธฐ์—” ํŽธํ•˜์ง€๋งŒ, ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ฃจํŠธ ๋‹จ์ผ ์„ค์น˜๋Š” ๋žœ๋ค์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ํ‚ค์šฐ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฒ„์ „ ์ •์ฑ…์€ ๋ฃจํŠธ์—์„œ ํ†ต์ œํ•˜๊ณ , ์„ค์น˜/์‚ฌ์šฉ์€ ๊ฐ ์›Œํฌ์ŠคํŽ˜์ด์Šค๊ฐ€ ๋ช…์‹œํ•˜๋Š” ํŒจํ„ด์ด ๊ฐ€์žฅ ์•ˆ์ •์ ์ด๋‹ค.

์ด์œ 

1) ์œ ๋ น ์˜์กด์„ฑ ๋ง‰๊ธฐ
์•ฑ๋งˆ๋‹ค package.json์— A/B/C๋ฅผ ์ง์ ‘ ์ ์–ด๋‘๋ฉด, ๋ˆ„๋ฝ๋œ ๊ฑด ๋ฐ”๋กœ "Cannot find module" ์—๋Ÿฌ๋กœ ๋‚˜ํƒ€๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ๋””๋ฒ„๊น…์ด ๊ฐ„๋‹จํ•ด์ง„๋‹ค.
2) ๋นŒ๋“œ ํˆด์ด ์ฐพ๋Š” ์œ„์น˜ ๋ฌธ์ œ
Vite๋‚˜ PostCSS๋Š” ํ˜„์žฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ธฐ์ค€์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฐพ๋Š”๋ฐ, ๋งŒ์•ฝ ์•ฑ ์ชฝ์— A/B/C๊ฐ€ ์—†์œผ๋ฉด ๊ฐ€๋” ํ•ด์„์ด ๊ผฌ์ผ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ๋ ‰ํŠธ๋ก ์ฒ˜๋Ÿผ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ตฌ์กฐ๋ผ๋ฉด, ๊ฐ์ž ๋ช…์‹œํ•˜๊ณ  ๊ณต์šฉ ์„ค์ •๋งŒ ๊ณต์œ ํ•˜๋Š” ์ชฝ์ด ํ›จ์”ฌ ์•ˆ์ •์ !

๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.

  • ๊ณต์šฉ ์„ค์ •๋งŒ ํŒจํ‚ค์ง€ํ™”: library/config-*
    • ์—ฌ๊ธฐ์„œ๋Š” peerDependencies๋กœ๋งŒ ์š”๊ตฌ
  • ๊ฐ ์•ฑ(app/renderer-a, app/renderer-b)์€ devDeps์— A/B/C ์ง์ ‘ ์„ค์น˜
  • ๋ฃจํŠธ์—์„œ ๋ฒ„์ „๋งŒ ๊ฐ•์ œํ•จ.
{
  "resolutions": {
    "a": "8.4.47",
    "b": "3.4.14",
    "c": "10.4.20"
  }
}

resolutions / constraints ์ฐจ์ด

resolutions

  • ๋ฒ„์ „ override ๋„๊ตฌ
  • ํŠธ๋ฆฌ ์–ด๋”˜๊ฐ€์—์„œ ์“ฐ์ด๋Š” ์˜์กด์„ฑ ๋ฒ„์ „์„ ๋ฃจํŠธ์—์„œ ๊ฐ•์ œ๋กœ ๊ณ ์ •ํ•œ๋‹ค.
  • package.json ์•ˆ์— "resolutions": { "react": "18.3.1" } ์ด๋ ‡๊ฒŒ ์ ์œผ๋ฉด, ๋ชจ๋“  ์›Œํฌ์ŠคํŽ˜์ด์Šค/๋ชจ๋“  transitive deps๊ฐ€ react@18.3.1๋กœ ํ†ต์ผ๋œ๋‹ค.
  • npm์˜ overrides๋ž‘ ๋น„์Šทํ•œ ๊ฐœ๋….

์žฅ์ : "ํ•˜์œ„์—์„œ react@18.2 ์š”์ฒญํ–ˆ์–ด๋„ ๋ฌด์กฐ๊ฑด 18.3.1์„ ์„ค์น˜ํ•ด๋ผ" ๊ฐ™์€ ๊ธด๊ธ‰ ํŒจ์น˜/๋ณด์•ˆ ํ•€ ๊ณ ์ •์— ์œ ์šฉ.
๋‹จ์ : "๊ฐ ์›Œํฌ์ŠคํŽ˜์ด์Šค๊ฐ€ react๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค" ๊ฐ™์€ ๊ทœ์น™์€ ๊ฐ•์ œํ•˜์ง€ ๋ชปํ•จ.

constraints

  • ์ •์ฑ…/๊ทœ์น™ ์—”์ง„
  • ์–ด๋–ค ์›Œํฌ์ŠคํŽ˜์ด์Šค๊ฐ€ ์–ด๋–ค ์˜์กด์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•˜๋Š”์ง€, devDeps์—๋งŒ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€, ๋ฒ„์ „ ๋ฒ”์œ„๋Š” ์–ด๋–ค์ง€ ๋“ฑ์„ ๋ฃฐ๋กœ ๊ฐ•์ œํ•จ.
    ex) ๋ชจ๋“  ์›Œํฌ์ŠคํŽ˜์ด์Šค๊ฐ€ react๋ฅผ ์“ด๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ^18.3.1 ๋ฒ”์œ„๋ฅผ ์จ์•ผ ํ•œ๋‹ค
gen_enforced_dependency(WorkspaceCwd, "react", "^18.3.1") :- 
  workspace_has_dependency(WorkspaceCwd, "react").

์žฅ์ : ๊ทœ์น™ ์œ„๋ฐ˜์„ CI์—์„œ ์žก์•„๋‚ด๊ณ , ํŒ€ ์ฐจ์›์˜ ํ•ฉ์˜๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Œ.
๋‹จ์ : ์„ ์–ธ๋งŒ ํ•ด๋†จ๋Š”๋ฐ transitive dep์—์„œ ๋ฒ„์ „ ์ถฉ๋Œ์ด ๋‚˜๋ฉด, ๊ฒฐ๊ตญ resolutions ๊ฐ™์€ ๊ฑธ๋กœ override ํ•„์š”ํ•จ.

https://stackoverflow.com/questions/51235261/why-does-yarn-warn-when-adding-a-dependency-to-the-root-workspaces-package-json

https://yarnpkg.com/configuration/manifest#resolutions

https://yarn2.netlify.app/features/constraints

https://yarnpkg.com/features/workspaces