Yarn: ์ž‘์—… ๊ณต๊ฐ„: ์ž‘์—… ๊ณต๊ฐ„๋‹น ํŒŒ์ผ ์ž ๊ธˆ

์— ๋งŒ๋“  2018๋…„ 02์›” 28์ผ  ยท  54์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: yarnpkg/yarn

๊ธฐ๋Šฅ ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ  ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
ํŠน์ง•

ํ˜„์žฌ ํ–‰๋™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์ตœ์ƒ์œ„ ๋…ธ๋“œ ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜๋Š” monorepo์— ๋Œ€ํ•œ yarn ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋ฉด monorepo์˜ ๋ฃจํŠธ์— ๋‹จ์ผ yarn.lock ๋งŒ ์ƒ์„ฑ๋˜๊ณ  ์ตœ์ƒ์œ„ ๋…ธ๋“œ ๋ชจ๋“ˆ์— ํŠน์ •ํ•œ yarn.lock ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์•ฑ(์ตœ์ƒ์œ„ ๋…ธ๋“œ ๋ชจ๋“ˆ)๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ monorepo์˜ ๋ฃจํŠธ์— ๋‹จ ํ•˜๋‚˜์˜ yarn.lock ํŒŒ์ผ yarn.lock ํŒŒ์ผ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ž‘์—… ๊ณต๊ฐ„์€ ๋‚˜์ค‘์— monorepo ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ:
workspace-a ๋ฐ workspace-b 2๊ฐœ์˜ ์ž‘์—… ๊ณต๊ฐ„์ด ์žˆ๋Š” ๋ชจ๋…ธ๋ ˆํฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ workspace-a ๋Š” workspace-b ์—์„œ ๋‚ด๋ณด๋‚ธ ๋ชจ๋“ˆ ์ค‘ ์ผ๋ถ€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. workspace-a ๋ฅผ ๋„์ปค ์ด๋ฏธ์ง€๋กœ ํŒจํ‚ค์ง•ํ•˜๋ ค๋ฉด(๋˜๋Š” ์ „์ฒด monorepo ์—†์ด ํ•ด๋‹น ์ž‘์—… ๊ณต๊ฐ„์„ ์ž์ฒด์ ์œผ๋กœ ํŒจํ‚ค์ง•ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•) yarn.lock ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, workspace-a ์˜ ํŒŒ์ผ์„ monorepo์™€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์œผ๋กœ ์ด๋™ํ•  ๋•Œ yarn.lock ํŒŒ์ผ์ด ๋ˆ„๋ฝ๋˜๊ณ  ์ข…์†์„ฑ์„ ์„ค์น˜ํ•  ๋•Œ ๋ชจ๋“  ํŒŒ์ผ์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์ž ๊ธˆ ํŒŒ์ผ์˜ ์žฅ์ (๊ฐœ๋ฐœ์— ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Œ).

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์— ๋งค์šฐ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ monorepos์™€ ํ•จ๊ป˜ ์ผํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์€ ๋‚˜๋ฟ์ž…๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฑด ์•„๋‹๊นŒ? ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํ˜ธ์ด์ŠคํŒ… ์—†์ด lerna ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํŒจํ‚ค์ง€๋‹น ์ž ๊ธˆ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ตœ๊ทผ์— ์ถœ์‹œ๋œ nohoist ๊ธฐ๋Šฅ๋„ ์ž‘์—… ๊ณต๊ฐ„๋‹น ๋‹ค๋ฅธ yarn.lock ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— (์›ํ–ˆ์ง€๋งŒ) ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ด ๋Œ“๊ธ€ ๊ณผ ๋‹ค์†Œ ๊ด€๋ จ

node.js, ์›์‚ฌ ๋ฐ ์šด์˜ ์ฒด์ œ ๋ฒ„์ „์„ ์–ธ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.
๋…ธ๋“œ 8.9.3, ์–€ 1.5.1, OSX 10.13.3

cat-feature triaged

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ „์ฒด monorepo๋ฅผ ๊ฒฐ๊ณผ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ํŒจํ‚ค์ง•ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”„๋กœ๋•์…˜์—์„œ docker๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€๋ฒผ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ์ƒ๋‹นํžˆ ํฌ๋ฉฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ผ๋ถ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์™€ ๊ด€๋ จ๋˜์ง€๋งŒ ์ „๋ถ€๋Š” ์•„๋‹˜). ๋”ฐ๋ผ์„œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ํŒจํ‚ค์ง•ํ•  ๋•Œ ์ด๋ฏธ์ง€์— ํ•ด๋‹น ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์˜ ํŒŒ์ผ๊ณผ ์ ์ ˆํ•œ ์ข…์†์„ฑ์œผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ์ข…์†์„ฑ์ด ํฌํ•จ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋น— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋„์ปค ์ด๋ฏธ์ง€์˜ ์•„์น˜๋ฅผ ์œ„ํ•ด ๋นŒ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์—์„œ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์ „์ฒด monorepo๋ฅผ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ์š”๊ตฌ์— ๋งž์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์˜ ์ด๋ฏธ์ง€ ๋‚ด์—์„œ "yarn"์„ ์‹คํ–‰ํ•  ๋•Œ ๊ฑฐ๊ธฐ์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์›ํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜์ ์ธ ์ข…์†์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์†”๋ฃจ์…˜์€ ์ž‘์—… ๊ณต๊ฐ„๋งˆ๋‹ค yarn.lock ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ์ฃผ์–ด์ง„ ์ž‘์—… ๊ณต๊ฐ„์„ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ณผ์ •, ์ฃผ๋ฌธํ˜• ์ž‘์—… ๊ณต๊ฐ„์— ๋Œ€ํ•œ yarn.lock ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋“ฑ์˜ ๊ณผ์ •์— ๋„์›€์ด ๋˜๋Š” yarn ๋ช…๋ น์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ..

์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๐Ÿป

๋ชจ๋“  54 ๋Œ“๊ธ€

์›์‚ฌ ๋ธ”๋กœ๊ทธ ๊ธฐ๋ฐ˜ :

yarn.lock์ด ํฌํ•จ๋œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋ฉด ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์ž๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ข…์†์„ฑ์„ ์„ค์น˜ํ•  ๋•Œ ์ž์‹ ์˜ yarn.lock ํŒŒ์ผ๋งŒ ์กด์ค‘๋ฉ๋‹ˆ๋‹ค. ์ข…์†์„ฑ ๋‚ด์˜ ์ž ๊ธˆ ํŒŒ์ผ์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•  ๋•Œ yarn.lock์„ ๋ฌถ์„ ํ•„์š”๋Š” ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... ์ „์ฒด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ ์•„ํ‹ฐํŒฉํŠธ์— ๋” ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ํŒจํ‚ค์ง€์— ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@connectdotz ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๊ฒŒ์‹œ๋œ ํŒจํ‚ค์ง€์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋นŒ๋“œํ•˜๋ ค๋ฉด ํ™•์‹คํžˆ ์žˆ์–ด์•ผ ํ•  ์–ด๋”˜๊ฐ€์— ๋ฐฐํฌํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ...ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์—๋Š” ์ „์ฒด ์ €์žฅ์†Œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์–ด์จŒ๋“  yarn.lock์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ OS ๋˜๋Š” ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ๋ชจ๋…ธ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ „์ฒด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€ ํ•ด๋‹น yarn.lock์„ ๋ฐฐํฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ฃผ๊ธฐ ๋™์•ˆ monorepo ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€๋ฅผ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ๋ฐฐํฌํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ „์ฒด monorepo๋ฅผ ๊ฒฐ๊ณผ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ํŒจํ‚ค์ง•ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”„๋กœ๋•์…˜์—์„œ docker๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€๋ฒผ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ์ƒ๋‹นํžˆ ํฌ๋ฉฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ผ๋ถ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์™€ ๊ด€๋ จ๋˜์ง€๋งŒ ์ „๋ถ€๋Š” ์•„๋‹˜). ๋”ฐ๋ผ์„œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ํŒจํ‚ค์ง•ํ•  ๋•Œ ์ด๋ฏธ์ง€์— ํ•ด๋‹น ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์˜ ํŒŒ์ผ๊ณผ ์ ์ ˆํ•œ ์ข…์†์„ฑ์œผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ์ข…์†์„ฑ์ด ํฌํ•จ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋น— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋„์ปค ์ด๋ฏธ์ง€์˜ ์•„์น˜๋ฅผ ์œ„ํ•ด ๋นŒ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์—์„œ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์ „์ฒด monorepo๋ฅผ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ์š”๊ตฌ์— ๋งž์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์˜ ์ด๋ฏธ์ง€ ๋‚ด์—์„œ "yarn"์„ ์‹คํ–‰ํ•  ๋•Œ ๊ฑฐ๊ธฐ์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์›ํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜์ ์ธ ์ข…์†์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์†”๋ฃจ์…˜์€ ์ž‘์—… ๊ณต๊ฐ„๋งˆ๋‹ค yarn.lock ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ์ฃผ์–ด์ง„ ์ž‘์—… ๊ณต๊ฐ„์„ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ณผ์ •, ์ฃผ๋ฌธํ˜• ์ž‘์—… ๊ณต๊ฐ„์— ๋Œ€ํ•œ yarn.lock ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋“ฑ์˜ ๊ณผ์ •์— ๋„์›€์ด ๋˜๋Š” yarn ๋ช…๋ น์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ..

์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๐Ÿป

@netanelgilad ์ž์„ธํ•œ ๋‚ด์šฉ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ”„๋กœ๋•์…˜ ๋˜๋Š” ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œ ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ํ†ตํ•ฉ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก #4521์˜ ํ† ๋ก ์— ์ฐธ์—ฌํ•˜์‹ญ์‹œ์˜ค.

๊ฐœ๋ณ„ ์ž ๊ธˆ ํŒŒ์ผ์˜ ์‚ฌ์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” -f ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ repo์˜ ๋ฃจํŠธ์—์„œ docker๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ „์ฒด repo๋ฅผ ์ปจํ…์ŠคํŠธ๋กœ ๊ฐ€์ง€๋ฉฐ ๋ฃจํŠธ์—์„œ package.json ๋ฐ yarn.lock์„ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€์— ๋นŒ๋“œํ•  ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด์„œ๋งŒ package.json์ด ํ•„์š”ํ•˜๋ฉฐ, yarn.lock์— ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฒƒ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด๋„ yarn์€ ๋ณต์‚ฌํ•œ package.json ํŒŒ์ผ์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€๋งŒ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ทธ ๋ง๊ณผ ํ•จ๊ป˜. ๋นŒ๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋”๋ผ๋„ ๋„์ปค ์บ์‹œ๊ฐ€ ๋ชจ๋“  ํŒจํ‚ค์ง€์˜ ํŒจํ‚ค์ง€ ๋ณ€๊ฒฝ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

4206์€ ๊ด€๋ จ/์ค‘๋ณต์ด๋ฉฐ ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ •ํ™•ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์ง๋ฉดํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

10๊ฐœ์˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์›ํ•  ๊ฒฝ์šฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ทธ๋“ค ๋ชจ๋‘๊ฐ€ ์ž์‹ ์˜ ์ €์žฅ์†Œ์— ์‚ด๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ฐ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ํ•˜์œ„ ๋ชจ๋“ˆ์ด ์žˆ๋Š” ๋ฉ”๊ฐ€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€ ์ด๋Ÿฌํ•œ ๊ฐ ํ•˜์œ„ ๋ชจ๋“ˆ์„ ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” package.json์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ๊ณต๊ฐ„๊ณผ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ๋Š” ๋งŽ์€ ๋กœ์ปฌ ํŒจํ‚ค์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” web-app ์ž…๋‹ˆ๋‹ค.

web-app/
|--node_modules/
|--packages/
|  |--controls/
|  |  |--src/
|  |  |--package.json
|  |--utils/
|     |--src/
|     |--package.json
|--src/
|--package.json
|--yarn.lock

์ž‘์—… ๊ณต๊ฐ„ ํŒจํ‚ค์ง€ controls ๋ฐ utils ์€ ๊ฒŒ์‹œ๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ฒฝ๋กœ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” controls ํŒจํ‚ค์ง€( yarn pack )๋ฅผ ๋ฆด๋ฆฌ์Šคํ•ด์•ผ ํ•˜๊ณ  ์ž์ฒด์ ์œผ๋กœ ๋นŒ๋“œ/ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, yarn install ์•ˆ์— web-app/packages/constols/ yarn install ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ๊ณต๊ฐ„์—์„œ๋Š” ์ตœ์ƒ์œ„ web-app/yarn.lock ํŒŒ์ผ์„ ์ตœ์ƒ์œ„ web-app/node-modules/ ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ web-app/packages/controls/package.json ์ง€์ •๋œ ํ•˜์œ„ ์ง‘ํ•ฉ ๋Œ€์‹  ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ํŒจํ‚ค์ง€์— ์ž์ฒด package.json ํ•„์š”ํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์ด ์žˆ๊ณ  ๋‹ค๋ฅธ ์ž‘์—… ๊ณต๊ฐ„์—์„œ ๋ˆ„๋ฝ๋œ deps๋ฅผ ์ฑ„์šฐ๋Š” ํ–‰์šด์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฃจํŠธ์˜ yarn.lock ๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๋กœ์ปฌ package.json ์ง€์ •๋œ ํŒจํ‚ค์ง€๋งŒ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ตœ์ƒ์œ„ ๊ตฌ์„ฑ์„ ๊ฒ€์ƒ‰ํ•˜์ง€ ๋ง๊ณ  .yarnrc/.npmrc .

์ด๊ฒƒ๋„ ๊ณ ๊ตฐ๋ถ„ํˆฌ. API์™€ ํ•จ๊ป˜ Angular CLI ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋™์ผํ•œ ์ €์žฅ์†Œ์— ์žˆ๊ณ  ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ Heroku๋กœ ํ‘ธ์‹œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Heroku์—๊ฒŒ ๋จผ์ € ํ”„๋ก ํŠธ์—”๋“œ ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ๋นŒ๋“œํŒฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/lstoll/heroku-buildpack-monorepo

๋ฌธ์ œ๋Š” nohoist ํŒจํ‚ค์ง€ ์•ˆ์— yarn.lock ๊ฐ€ ์—†์œผ๋ฏ€๋กœ Heroku๋Š” npm์œผ๋กœ ์„ค์น˜ํ•˜๊ณ  ์ž ๊ธด ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ์ƒˆ ํŒจํ‚ค์ง€๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ์ „์—ญ yarn.lock ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด Dockerfile์— ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.

WORKDIR /app
ENV NODE_ENV=production

ADD yarn.lock /app/
ADD package.json /app/

# Only copy the packages that I need
ADD packages/my-first-package /app/packages/my-first-package
ADD packages/my-second-package /app/packages/my-second-package

RUN cd /app && yarn install --frozen-lockfile

์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์•„๋‹Œ ๋‚ด๊ฐ€ ๋ณต์‚ฌํ•œ ๋‘ ํŒจํ‚ค์ง€์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ ์ค‘์ธ ์ข…์†์„ฑ๋งŒ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ํ•œ ํŒจํ‚ค์ง€์—์„œ ๋ฆด๋ฆฌ์Šค ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ํ•ด๋‹น ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Docker์˜ ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋กœ ์ƒ๋‹นํžˆ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  1. ๋„์ปค์— yarn.lock, package.json, UI ํŒจํ‚ค์ง€๋งŒ ์ถ”๊ฐ€
  2. yarn install --frozen-lockfile
  3. ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰
  4. ์ƒˆ ๋‹จ๊ณ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  yarn.lock, package.json ๋ฐ ํ•„์š”ํ•œ ๋Ÿฐํƒ€์ž„ ํŒจํ‚ค์ง€/์ž‘์—… ๊ณต๊ฐ„ ํด๋”๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  5. ๋นŒ๋“œ๋œ ์•„ํ‹ฐํŒฉํŠธ์— ๋Œ€ํ•ด COPY --from=<stage>
  6. yarn install --frozen-lockfile ์‹คํ–‰ํ•˜๊ณ  RUN ๋ช…๋ น์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Yarn.lock ํŒŒ์ผ์— ์ง€์ •๋˜๊ณ  ํ”„๋กœ๋•์…˜์— ํ•„์š”ํ•œ ์ข…์†์„ฑ๋งŒ ํฌํ•จํ•˜๋Š” ์ž‘์€ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

@johannes-scharlach
๋‚˜๋Š” ๋‹น์‹ ์ด ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋Š” ์ข‹์€ ํŒ์ž…๋‹ˆ๋‹ค :).

@connectdotz ๋‚ด ์ƒ๊ฐ์— ์ด ๋ฌธ์ œ๋Š” ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฌธ์ œ #4521์— ๋Œ€ํ•ด ๊ณ„์† ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ yarn.lock ํŒŒ์ผ์ด ํŒจํ‚ค์ง€์˜ ํ•˜์œ„ ์ง‘ํ•ฉ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—… ๊ณต๊ฐ„๋‹น yarn.lock์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค(๋น„๋ก ์ด๊ฒƒ์ด ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๐Ÿ˜‰ ). ๊ทธ๋Ÿฌ๋‚˜ #4521์˜ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์–ป์€ ์†”๋ฃจ์…˜์—์„œ ๋น„๋ก yarn์ด ์ƒํ˜ธ ์˜์กด์„ฑ๊ณผ ์ฃผ์–ด์ง„ ์ž‘์—… ๊ณต๊ฐ„์„ "๊ณต๊ธ‰์—…์ฒด"๋กœ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ Dockerfile์˜ ๋ชจ๋“  ์ข…์†์„ฑ ์ž‘์—… ๊ณต๊ฐ„์„ ์–ธ๊ธ‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์ฒซ ๋ฒˆ์งธ Lerna๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ Yarn ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. Yarn์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ–ˆ์œผ๋ฉฐ ํŠนํžˆ ์ตœ๊ทผ yarn workspaces run <script> ๋ฐ wsrun ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ๋„์ž…๋˜๋ฉด์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ผ yarn.lock ๋Š” ๊ณจ์นซ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  • ๊ธฐ์กด ์ž ๊ธˆ ํŒŒ์ผ์„ ๋‹จ์ผ ์ž ๊ธˆ ํŒŒ์ผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค( https://github.com/yarnpkg/yarn/issues/6563 ์ฐธ์กฐ). ๊ฑฐ๊ธฐ์—๋Š” ์ˆ˜๋งŒ ์ค„์ด ์žˆ๊ณ  ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ ๊ธฐ์กด ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋งŽ์€ ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„์ „ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ํŒจํ‚ค์ง€์—๋งŒ ์ข…์†์„ฑ ์„ค์น˜("de-hoisting" / "vendoring") Dockerํ™”๋œ ๋นŒ๋“œ๋Š” ์ž˜ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„(https://github.com/yarnpkg/yarn/issues/5428#issuecomment-403722271) ๋˜๋Š” https: //github.com/yarnpkg/yarn/issues/4521.

Yarn ์ž‘์—… ๊ณต๊ฐ„์ด ํŠน์ • ๊ธฐ๋Šฅ์ด ์—†๋Š” ํŒจํ‚ค์ง€ ์„ ์–ธ์ธ

  • ์ž‘์—… ๊ณต๊ฐ„์—์„œ ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด yarn workspaces run <script> ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ์ž ๊ธˆ ํŒŒ์ผ๊ณผ ํ˜ธ์ด์ŠคํŒ…์„ ์›ํ•˜๋ฉด(๋‘ ๊ฐœ๋Š” ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ๋ฌถ์—ฌ ์žˆ์Šต๋‹ˆ๊นŒ?), ์ด๊ฒƒ์€ ๋ฃจํŠธ package.json .
    json "workspaces": { "packages": ["packages/*"], "hoistDependencies": true }
  • ํ˜„์žฌ ์ž ๊ธˆ ํŒŒ์ผ์„ ํ˜ธ์ด์ŠคํŠธ ๊ตฌ์กฐ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด yarn workspaces hoist-dependencies ํ•ฉ๋‹ˆ๋‹ค.

๋“ฑ์€ ์˜ˆ์‹œ์ผ ๋ฟ์ด๋ฉฐ ์‹ค์ œ๋กœ ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์˜ตํŠธ์ธ ๋Œ€์‹  ์˜ตํŠธ์•„์›ƒ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ(์˜ˆ: ์‚ฌ๋žŒ๋“ค์€ ์ง€๊ธˆ๊นŒ์ง€ ๋‹จ์ผ yarn.lock ๋ฐ ํ˜ธ์ด์ŠคํŒ…์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค) ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋Š” ์ž‘์—… ๊ณต๊ฐ„์ด repo ์ „์ฒด ์ž‘์—…์„ ์œ„ํ•œ ๊ฐ€๋ฒผ์šด ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋‚˜์š”?

์ด ๊ธฐ๋Šฅ ์š”์ฒญ์ด ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋Š” #4521์—์„œ์™€ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @johannes-scharlach๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์„ ๋ณธ์งˆ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช…๋ น์€ ์ž‘์—… ๊ณต๊ฐ„๋‹น ์ž ๊ธˆ ํŒŒ์ผ๋ณด๋‹ค ํ™•์‹คํžˆ ๋” ์‹คํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ˜„์žฌ ์ค‘์ฒฉ๋œ ์ž‘์—… ๊ณต๊ฐ„์— ๋Œ€ํ•œ RFC๊ฐ€ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด ๊ธฐ๋Šฅ ์š”์ฒญ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

Yarn ์ž‘์—… ๊ณต๊ฐ„์ด ํŠน์ • ๊ธฐ๋Šฅ์ด ์—†๋Š” ํŒจํ‚ค์ง€ ์„ ์–ธ์ธ ์ž‘์€ ์ฝ”์–ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์ž‘์—… ๊ณต๊ฐ„์€ ํฌ๊ฒŒ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋งŒ์กฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ๊ณต๊ฐ„์—์„œ ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด yarn workspaces run <script>

๊ทธ๊ฒƒ์€ ์ด๋ฏธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(v1.10, #6244).

ํ˜„์žฌ ์ž ๊ธˆ ํŒŒ์ผ์„ ํ˜ธ์ด์ŠคํŠธ ๊ตฌ์กฐ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด yarn workspaces hoist-dependencies ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ๊ณต๊ฐ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค( dehoistDependencies ).

๋‚ด๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ๊ธฐ์ˆ ์  ๋™์ž‘(ํ˜ธ์ด์ŠคํŒ…)์„ ์ทจํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์˜๋ฏธ๋ก ์  ๋™์ž‘์œผ๋กœ ๋ฐ”๊พธ๋ ค๊ณ  ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ์— ์ดˆ์ ์„ ๋งž์ถ˜ ๋‹ค์Œ ๊ทธ ๋ฐ˜๋Œ€๊ฐ€ ์•„๋‹Œ ๊ตฌํ˜„์„ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ ์‚ฌ๋ก€("ํŠน์ • ํŒจํ‚ค์ง€์—๋งŒ ์ข…์†์„ฑ ์„ค์น˜")๋ฅผ ํ™•์žฅํ•˜๋ฉด yarn --focus ๊ฐ€ ๋” ์ž˜ ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์งˆ๋ฌธ์€ ํ˜ธ์ด์ŠคํŒ…๊ณผ ๋‹จ์ผ yarn.lock ํŒŒ์ผ์ด ์ž‘์—… ๊ณต๊ฐ„์— ์—„๊ฒฉํ•˜๊ฒŒ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๊ทธ๊ฒƒ์ด ์ง„์ •์œผ๋กœ ๊ทธ๋“ค์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์—ญ์‚ฌ์ ์œผ๋กœ ๊ทธ๋“ค์ด ์–ป์€ ์ฒซ ๋ฒˆ์งธ ๊ธฐ๋Šฅ์ธ "๊ทธ๋ƒฅ"์ž…๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž‘์—… ๊ณต๊ฐ„์˜ ์ตœ์ƒ์˜ ๊ฐ€์ƒ ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ๊ฐœ๋ฐœ ์‹œ node_modules ๋ฅผ ํ˜ธ์ด์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด ๋กœ์ปฌ yarn.lock ํŒŒ์ผ์„ ์œ ์ง€ํ•˜๊ณ (๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ•œ ํŠน์ • ํŒจํ‚ค์ง€๋ฅผ Docker์—์„œ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค) ๋˜ํ•œ ํŒจํ‚ค์ง€๊ฐ€ ํŠน์ • ๋ฒ„์ „์„ ์ž ๊ธ€ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. #6563๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  • ํ˜ธ์ด์ŠคํŒ…์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ”ผํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ yarn workspaces run <script> ๋ฅผ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ด์ŠคํŒ…์€ nohoist ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ run ๋Š” ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ "๋น„ํ™œ์„ฑํ™”"ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹จ์ผ yarn.lock ํŒŒ์ผ์„ "๋น„ํ™œ์„ฑํ™”"ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ์ง€ ๋˜๋Š” ์•„์ง ์ถฉ๋ถ„ํžˆ ์š”์ฒญ๋˜์ง€ ์•Š์€ ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :)

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ yarn install --app-mode package@version

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠน์ • ๋ฒ„์ „์—์„œ ์•ฑ์„ ๊ฒŒ์‹œํ•  ๋•Œ ์ž‘์—… ๊ณต๊ฐ„ ์ž ๊ธˆ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๊ณ  app-mode ์„ค์น˜ํ•˜๋ฉด ๋ฒˆ๋“ค ์ž ๊ธˆ ํŒŒ์ผ์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

Yarn์€ ์ „์ฒด ์ž ๊ธˆ ํŒŒ์ผ์„ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒจํ‚ค์ง€์™€ ๊ด€๋ จ๋œ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„์˜ ์ผ๋ถ€๋งŒ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ด๊ฒƒ์€ ์ง€๊ธˆ๋„ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ํŒจํ‚ค์ง€ zip์„ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค(yarn์—๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ฒƒ์ด ์—†๊ณ  npm์€ npm pack package@version ).
  • node_modules/package์— gzip ์••์ถ•์„ ํ’‰๋‹ˆ๋‹ค.
  • node_modules/package๋กœ cd
  • ๊ฑฐ๊ธฐ ์—์„œ yarn install --production ์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค(๋ฒˆ๋“ค ์ž ๊ธˆ ํŒŒ์ผ์„ ์กด์ค‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค).

ํŽธ์ง‘: ๋ถˆํ–‰ํžˆ๋„ ์ž‘์—… ๊ณต๊ฐ„ ์ž ๊ธˆ ํŒŒ์ผ์—๋Š” ์•ฑ ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์ผ ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ๊ณต๊ฐ„ ๋‚ด์˜ ํŒจํ‚ค์ง€ ๋ฒ„์ „์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋ชจ๋‘ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์—… ๊ณต๊ฐ„ ์ž ๊ธˆ ํŒŒ์ผ์—์„œ ์•ฑ ์ž ๊ธˆ ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ ๋ณต์‚ฌ๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ณ„๋„์˜ ์ž ๊ธˆ ํŒŒ์ผ์ด ๋‹ต์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. CLI์™€ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ monorepo๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. CLI์—๋Š” ํŠน์ • ์„ค์ •์ด ์žˆ๋Š” ๋ฐ์Šคํฌํ†ฑ ์‹œ์Šคํ…œ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ํ”Œ๋žซํผ๋ณ„ ํŒจํ‚ค์ง€๊ฐ€ ๋ช‡ ๊ฐœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ํ˜„์žฌ ์ž‘์—… ๊ณต๊ฐ„ ๊ตฌํ˜„์—์„œ๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋„์ปค ์ด๋ฏธ์ง€๋กœ API๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@samuela ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค๋ฅธ "์‹ค์ œ" ์‚ฌ๋ก€์— ๋น„ํ•ด ์›ƒ๊ธฐ๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ์— ๋Œ€ํ•œ monorepo๊ฐ€ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜์‘ ํ›„ํฌ๊ฐ€ packages/* ์žˆ์Šต๋‹ˆ๋‹ค.

packages/* ์˜†์— ๋‘ ๋ฒˆ์งธ ์ž‘์—… ๊ณต๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. local/* ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ gitignore์— ์žˆ์œผ๋ฉฐ, ์•„์ด๋””์–ด๋Š” ํšŒ์‚ฌ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ์›ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด create-react-app ์•ฑ์„ ๊ฑฐ๊ธฐ์— ๋„ฃ๊ณ  ๊ฐœ๋ฐœ ์ค‘์— ํ›„ํฌ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ local/* ํŒจํ‚ค์ง€๊ฐ€ gitignore์— ์žˆ์ง€๋งŒ ๋ฃจํŠธ yarn.lock ๋Š” ๋กœ์ปฌ ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ ์ธํ•ด ๋‹จ์ˆœํžˆ ๋ถ€ํ’€๋ ค์ง€๊ณ  ์˜ค์—ผ๋˜์–ด git์— ์ฒดํฌ์ธ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ถ€ ์ž‘์—… ๊ณต๊ฐ„์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งคํ•‘๊ณผ ๊ฐ™์€ ํŠน์ • ์ž ๊ธˆ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  "workspaces": {
    "packages": [
      "packages/*",
      "local/*"
    ],
    "lockfiles": {
      "local/*": "./local.yarn.lock"
    }
  }

๋˜๋Š” "_์ด_ ์ž‘์—… ๊ณต๊ฐ„์—์„œ ์ž ๊ธˆ ํŒŒ์ผ์— ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์ง€ ๋งˆ์‹ญ์‹œ์˜ค"๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ, ๋‚ด ๊ฒƒ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹ฌ๊ฐํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. :)

๋ณ„๋„์˜ ์ž ๊ธˆ ํŒŒ์ผ์ด ๋‹ต์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. CLI์™€ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ monorepo๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. CLI์—๋Š” ํŠน์ • ์„ค์ •์ด ์žˆ๋Š” ๋ฐ์Šคํฌํ†ฑ ์‹œ์Šคํ…œ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ํ”Œ๋žซํผ๋ณ„ ํŒจํ‚ค์ง€๊ฐ€ ๋ช‡ ๊ฐœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ํ˜„์žฌ ์ž‘์—… ๊ณต๊ฐ„ ๊ตฌํ˜„์—์„œ๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋„์ปค ์ด๋ฏธ์ง€๋กœ API๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๋ชป ๋ฐ•์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด๊ธฐ์—, yarn.lock ํŒŒ์ผ์˜ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” frozen-dep ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! Yarn์˜ ์ œ์ž‘์ž๋Š” ๊ทธ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๊นŒ?

๋‹จ์ผ ์ž ๊ธˆ ํŒŒ์ผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ์ฃผ์žฅ์€ ์ฝ”๋“œ ์†Œ์œ ๊ถŒ์ž…๋‹ˆ๋‹ค. GitHub CODEOWNERS ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ผ ์ €์žฅ์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์†Œ์œ ๊ถŒ์„ ๊ฐœ๋ฐœ์ž ๊ทธ๋ฃน์— ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์ž‘์—… ๊ณต๊ฐ„์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ํ•ญ์ƒ ๋ฃจํŠธ ์ˆ˜์ค€ ์ž ๊ธˆ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์€ ์ž ๊ธˆ ํŒŒ์ผ์˜ ์ฝ”๋“œ ์†Œ์œ ์ž์˜ ์Šน์ธ์„ ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, ์ถฉ๋ถ„ํ•œ ๊ทœ๋ชจ์˜ ๋‹จ์ผ ์ €์žฅ์†Œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์›๋ž˜ ์ž‘์—… ๊ณต๊ฐ„์˜ ์†Œ์œ ์ž์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ž‘์—… ๊ณต๊ฐ„๋ณ„ ์ž ๊ธˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ์˜ต์…˜์ด ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ : Google App Engine์€ ์ž ๊ธˆ ํŒŒ์ผ(NPM/Yarn) ์—†์ด ๋…ธ๋“œ ์„œ๋น„์Šค ์‹œ์ž‘์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ๋“ค ์ž…์žฅ์—์„œ ํ›Œ๋ฅญํ•œ devop์ด์ง€๋งŒ ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ณ ํ†ต์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” env vars๋กœ ๋ชจ๋‘ ๋ฐฐํฌํ•˜๊ณ  env vars๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ„๊ธฐํ•˜๋„๋ก yarn start (์œ ์ผํ•˜๊ฒŒ ์ง€์›๋˜๋Š” ์ง„์ž…์ )๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ธฐ๋ณธ ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ฐ ์ž‘์—… ๊ณต๊ฐ„์— ๋ณต์‚ฌํ•˜๊ณ  ๊ด€์‹ฌ ์žˆ๋Š” ์„œ๋น„์Šค๋งŒ ๋ฐฐํฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. (@johannes-scharlach์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.)

๊ถ๊ทน์ ์œผ๋กœ ์ž‘์—… ๊ณต๊ฐ„ ์ž ๊ธˆ ํŒŒ์ผ๋ณ„๋กœ ์ƒ์„ฑ๋œ yarn install --workspace-lockfile ๋ช…๋ น์ด ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ์ž ๊ธˆ ํŒŒ์ผ์— ๋Œ€ํ•œ ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ์šฐ๋ฆฌ์—๊ฒŒ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ข…์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋‹จ์ผ ํŒจํ‚ค์ง€๋งŒ ํฌํ•จํ•˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๊ฒŒ์‹œ๋˜์–ด ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋กœ์ปฌ์—์„œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ๋งค์šฐ ์œ ์šฉํ•  ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ์šฐ๋ฆฌ ์ปดํ“จํ„ฐ์— ๋ณต์ œํ•˜๋Š” ํ‘œ์ค€ ๋นˆ ์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„ ๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ํŒจํ‚ค์ง€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋กœ์ปฌ ๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ค‘ ์ผ๋ถ€๋Š” ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€ ๋ณต์ œ๋ณธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ์ผ๋ถ€๋Š” 5๊ฐœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ณ  ๋กœ์ปฌ, ๊ต์ฐจ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ๊ต์ฐจ ์ข…์†์„ฑ ๊ฐœ๋ฐœ์„ ์ ˆ๋Œ€์ ์œผ๋กœ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ข…์†์„ฑ์„ ํŽธ์ง‘ํ•ด๋„ ๋กœ์ปฌ ์›์‚ฌ ์ž ๊ธˆ ํŒŒ์ผ์ด ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๊ณ  ํ•ญ์ƒ ์—…๋ฐ์ดํŠธ ์ข…์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๋Š” ๋นˆ ๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ฃจํŠธ ํŒŒ์ผ์ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค(๋ชจ๋“  ํ•ญ๋ชฉ์ด ๋‹ค์Œ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. /packages gitignore.

๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์— ๋Œ€ํ•œ ์ž ๊ธˆ ํŒŒ์ผ ์“ฐ๊ธฐ๋ฅผ ํ˜ธ์ด์ŠคํŠธํ•˜์ง€ ์•Š๋Š” ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ํ›Œ๋ฅญํ•˜๊ณ  ํŒจํ‚ค์ง€ ์ˆ˜์ค€์—์„œ ์ž‘์„ฑํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ•œ Docker์™€ ๊ด€๋ จ๋œ ๋ฐฐํฌ ๋ฐ ๋นŒ๋“œ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์œผ๋ฉฐ ์ด๊ฒƒ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ด ๊ธฐ๋Šฅ์€ ์ €์—๊ฒŒ๋„ ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ถ€ ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์— ๋ฐฐํฌ๋œ ๋‹จ์ผ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” Now.sh์™€ ํ•จ๊ป˜ ๋ฐฐํฌ๋œ Next.js ์•ฑ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Firebase์— ๋ฐฐํฌ๋œ ํด๋ผ์šฐ๋“œ ๊ธฐ๋Šฅ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

์ด ๋‘ ๋ฐฐํฌ ๋ชจ๋‘์—์„œ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๊ณ  ํด๋ผ์šฐ๋“œ์— ์„ค์น˜ ๋ฐ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์†Œ์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  yarn.lock ํŒŒ์ผ์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ข…์†์„ฑ์ด package.json์˜ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜๋˜๊ณ  ์ž ๊ธด ๋ฒ„์ „์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐ ์ž‘์—… ๊ณต๊ฐ„์—์„œ yarn.lock ํŒŒ์ผ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ €๋Š” ์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„์ด ์ฃผ๋กœ monorepos๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž„์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ @LeeCheneler ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฒฝ์šฐ ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ(๋ชจ๋‘ ์ž์ฒด ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Œ)์—์„œ ์ข…์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” React ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋กœ์ปฌ ๋ฒ„์ „์„ ์‰ฝ๊ฒŒ ์ฐธ์กฐํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ๋กœ์ปฌ ๋ฒ„์ „์— ๋น ๋ฅด๊ฒŒ ์ „ํŒŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ library: "*" ์ข…์†์„ฑ์ด ๋ณ€๊ฒฝ ์—†์ด ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๋•์…˜์œผ๋กœ ํ‘ธ์‹œํ•  ๋•Œ package.json์„ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ์›์‚ฌ ์ž ๊ธˆ ํŒŒ์ผ์ด ์—†์œผ๋ฉด ๊ฐ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ๋•์…˜ ๋ฒ„์ „์ด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” yarn ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ณตํ†ต์ ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ƒ์œ„ ์ž ๊ธˆ ํŒŒ์ผ์˜ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋Š” Docker์˜ ๊ณ„์ธต ์บ์‹ฑ์„ ์ค‘๋‹จํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋จผ์ € package.json ๋ฐ yarn.lock์„ ๋ณต์‚ฌํ•˜์—ฌ Docker ์บ์‹ฑ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Docker๊ฐ€ ํ•ด๋‹น ํŒŒ์ผ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์œผ๋ฉด ์ด์ „ ๊ณ„์ธต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ์ž ๊ธˆ ํŒŒ์ผ์ด ์ „์ฒด ๋ชจ๋…ธ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋‹จ์ผ ํŒŒ์ผ์ธ ๊ฒฝ์šฐ ํŒจํ‚ค์ง€๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์บ์‹œ๊ฐ€ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์ด๊ฒƒ์€ ์บ์‹œ ์—†์ด ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๋นŒ๋“œ๋˜๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ๋Š๋ฆฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํŒจํ‚ค์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๋Š” Lerna์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ์ž ๊ธˆ ํŒŒ์ผ์˜ ์ข…์†์„ฑ ๋ณ€๊ฒฝ์ด ์ตœ์ƒ์œ„ ์ˆ˜์ค€์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

์ด (์•ฝ๊ฐ„ ์˜ค๋ž˜๋œ) ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ด์„œ ์œ ๊ฐ์ด์ง€๋งŒ ์ด๊ฒƒ์ด ๋„์›€์ด ๋  ์‚ฌ์šฉ ์‚ฌ๋ก€๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…๋ฆฝ์ ์œผ๋กœ ํ˜ธ์ŠคํŒ…๋˜๊ณ  ๊ฐœ๋ฐœ๋œ 10๊ฐœ ์ •๋„์˜ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๊ฐ€ ์žˆ์ง€๋งŒ yarn install ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ชจ๋“  ํด๋”์— ์ข…์†์„ฑ์„ ์„ค์น˜ํ•œ ๋‹ค์Œ yarn start ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์•™ ์ž‘์—… ๊ณต๊ฐ„ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด์ง€๋งŒ yarn ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ ๊ฐ micorservice์˜ yarn.locks๋ฅผ ์กด์ค‘ํ•˜๋ฉด์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@nahtnam Yarn 1.x monorepo์˜ ์•„์ด๋””์–ด๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์ง€๋ถ• ์•„๋ž˜์˜ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋…ธ์ถœ๋œ ๋‹จ์ผ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ(์ž‘์—… ๊ณต๊ฐ„์ด๋ผ๊ณ  ํ•จ)์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ด์ง€ ์•Š์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Babel ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•˜๋‚˜์˜ ๋” ํฐ ์—”ํ„ฐํ‹ฐ๋กœ, preset-env ๋Š” ํ•˜์œ„ ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ข…์†์„ฑ์ด ํ†ตํ•ฉ๋œ๋‹ค๋Š” ์ ์—์„œ ๋™์งˆ์ ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ํŒจํ‚ค์ง€๊ฐ€ core-js ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๋‹จ์ผ ํŒจํ‚ค์ง€์—์„œ ๋™์ผํ•œ core-js ๋ฒ„์ „์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ฃจํŠธ ์ž ๊ธˆ ํŒŒ์ผ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์ž ๊ทธ๊ฑฐ๋‚˜ ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๊ฐ€ ๋‹ค๋ฅธ ๋ฒ„์ „์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฃจํŠธ node_modules ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ํŒฉ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ(๋…๋ฆฝ์ ์ด๋ฉฐ ์ผ๋ถ€๋Š” ๋ช‡ ๋…„ ๋™์•ˆ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ๋˜๋ฉฐ ๋‹ค๋ฅธ ํŒ€์—์„œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Œ) ๋ฃจํŠธ๊ฐ€ ์—†๋Š” ๊ฐœ์ธ ์ž ๊ธˆ ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž ๊ธˆ (Docker ๋ฌธ์ œ๋„ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค). ์œ ์ผํ•œ ์งˆ๋ฌธ์€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์— ์–ด๋–ค ๋„๊ตฌ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ธ์ง€์ž…๋‹ˆ๋‹ค. Lerna๋Š” Yarn์— ๋ฌถ์—ฌ ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ต์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์ผํ•œ ์งˆ๋ฌธ์€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์— ์–ด๋–ค ๋„๊ตฌ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ธ์ง€์ž…๋‹ˆ๋‹ค. Lerna๋Š” Yarn์— ๋ฌถ์—ฌ ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ต์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@the-spyke ๊ทธ๋ฟ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. yarn workspaces ๋„ npm link ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์šฉ ๋ชจ๋“ˆ์„ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค. npm link ๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@spyke ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์–ด๋–ค ์ด์œ ์—์„œ์ธ์ง€ ๋’ค์ง‘ํžŒ ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค(lerna ๋Œ€ yarn ์ž‘์—… ๊ณต๊ฐ„). ๋‚˜๋Š” lerna๋ฅผ ์กฐ์‚ฌํ–ˆ๊ณ  ๊ทธ๊ฒƒ์ด ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๋Š” ๋ชจ๋“  ๋‹จ์ผ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•„์š”ํ•  ๋•Œ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ utilities ํŒจํ‚ค์ง€๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด์ง€, ๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ(๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด๊ฐ€ ๋“ค์–ด๋ณธ ์ ์ด ์—†๋Š” ๋™์‹œ์— ๋‘ ๊ฐœ์˜ ๋ถ„๊ธฐ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•จ), ๋‚ด utilities ์˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋งˆ๋‹ค ์ข…์†์„ฑ์„ ๋‹ค์‹œ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. package.json ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ IDE ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ๊ฒฝ์šฐ) ; ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. @the-spyke๋Š” ์ข‹์€ ์ง€์ ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ independent projects under one roof ๋Š” ์ž‘์—… ๊ณต๊ฐ„์˜ ๋ชฉ์ ์ด ์•„๋‹ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์—ฌ๊ธฐ์„œ ํ•˜๊ณ  ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. monorepo-base ์ €์žฅ์†Œ๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. packages ํด๋”๋Š” ์ œ์™ธ ๋˜์ง€๋งŒ packages ์•„๋ž˜์˜ ๊ฐ ํด๋”๋Š” ๋ณ„๋„์˜ ๋…๋ฆฝ์ ์ธ git repo์ž…๋‹ˆ๋‹ค.
image
๋ฌผ๋ก  ์ด๊ฒƒ์€ ์ €๋ฅผ ์ด ์Šค๋ ˆ๋“œ์˜ ์ฃผ์ œ๋กœ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ํ•˜๋‚˜์˜ repo๋กœ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํŠธ ์ˆ˜์ค€ yarn.lock ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด --no-lockfile ๋ฅผ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ์ตœ๊ทผ์— class-validator ์˜ ์ถฉ๋Œํ•˜๋Š” ๋ฒ„์ „์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋ชจ๋“  dep๋ฅผ ํŠน์ • ๋ฒ„์ „์œผ๋กœ ์ž ๊ทธ๊ณ (์†”์งํžˆ ๊ทธ ์ˆ˜์ค€์˜ ์ œ์–ด๊ฐ€ ๋‚˜์—๊ฒŒ ๋” ์ดํ•ด๊ฐ€ ๋จ) ์ž‘๋™ ๋ฐฉ์‹์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ „์ฒด ํŠธ๋ ˆ๋“œ๋ฅผ ๋‹ค์‹œ ์ฝ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํŒ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”์‹ .
yarn why ๋Š” lockfile ์—†์ด๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด App Engine์˜ ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๋ณ„๋„์˜ ์ €์žฅ์†Œ์ธ ๊ฒฝ์šฐ(VCS์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ) ์„ค์น˜ํ•  ๋•Œ๋งˆ๋‹ค ์ž ๊ธˆ ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ตฌ์ฒด์ ์ธ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ @johannes-scharlach๊ฐ€ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์€ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€์— ์ผ๋ถ€ ๋นŒ๋“œ ํด๋”์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๋Ÿฐํƒ€์ž„ ๋…ธ๋“œ ๋ชจ๋“ˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋งค์šฐ ์ง€์ €๋ถ„ํ•ด์ง‘๋‹ˆ๋‹ค. ์ตœ์ข… ๋นŒ๋“œ ๋‹จ๊ณ„.

(์ฃผ์ œ์—์„œ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚จ )

๋‹ค์Œ์€ ๊ธฐ์กด Docker ์›Œํฌํ”Œ๋กœ์— ๋Œ€ํ•œ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ๋„๋‹ฌํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

  1. ln project/yarn.lock packages/package1/yarn.lock - ๋ฃจํŠธ yarn.lock ์—์„œ ๊ฐ ํŒจํ‚ค์ง€๋กœ ํ•˜๋“œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ์ถ”๊ฐ€ COPY yarn.lock . ๊ฐ๊ฐ packages/package1/Dockerfile
  3. yarn install Docker ๋‚ด๋ถ€

์žฅ์  :

  • ์ „์ฒด ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด์— ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํŒจํ‚ค์ง€ ์ˆ˜์ค€ Dockerfile์„ ๋ฃจํŠธ์—์„œ ๋‹จ์ผ Dockerfile๋กœ ๋ณ‘ํ•ฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์—… ๊ณต๊ฐ„ ์ž ๊ธˆ ํŒŒ์ผ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์  :

  • --frozen-lockfile ์ด(๊ฐ€) ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘์—… ๊ณต๊ฐ„ ํŒจํ‚ค์ง€๋Š” yarn.lock ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ yarn์€ yarn.lock ์กด์žฌํ•˜์ง€ ์•Š๋Š” package.json "์ถ”๊ฐ€ํ•œ" ํŒจํ‚ค์ง€๋ฅผ ๋ด…๋‹ˆ๋‹ค.

CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ yarn --frozen-lockfile ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ด๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” ์ƒ๊ด€์—†์ด ์‚ฌ์†Œํ•œ ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
์ œ ์ƒ๊ฐ์—๋Š” ์„ค์น˜์— ๋Œ€ํ•œ ์›์‚ฌ ๋ฌธ์„œ๊ฐ€ ํŒจํ‚ค์ง€ ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค์—์„œ ์ž ๊ธˆ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
๋”ฐ๋ผ์„œ git์€ ์‹ค์ œ๋กœ ํ•˜๋“œ ๋งํฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ์†Œํ”„ํŠธ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ ์ด ์ „๋žต์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ ์‚ฌ์ „ ์ปค๋ฐ‹ githook์„ ์‚ฌ์šฉํ•˜์—ฌ yarn.lock ๋ฅผ ๊ฐ ์ž‘์—… ๊ณต๊ฐ„์— ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค... ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ๋ฐฐํฌํ•  ๋•Œ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ฅผ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dan-cooke ํ†ต์ฐฐ๋ ฅ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@dan-cooke, ์ž‘์—… ๊ณต๊ฐ„์˜ ์ƒˆ๋กœ์šด ์ข…์†์„ฑ์ด ๋ชจ๋“  Dockerfile์— ๋Œ€ํ•œ ์„ค์น˜ ๊ณ„์ธต์„ ๋ฌดํšจํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ Docker์˜ ๊ณ„์ธต ์บ์‹ฑ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

@migueller ์„ค์น˜ ๊ณ„์ธต์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ์ž ๊ธˆ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ข…์†์„ฑ์„ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ๋ชฉ๋ก์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ณ  ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด Workspaces์˜ ์ „์ฒด ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. Docker ์บ์‹œ๋ฅผ "์ค‘๋‹จ"ํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์‹ค์ œ ์ข…์†์„ฑ์ด package.json ์ง€์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ๊ฐ€ ๋ฌดํšจํ™”๋˜๋ฏ€๋กœ ํŒจํ‚ค์ง€์˜ ์ตœ์ข… ์ฝ”๋“œ๋Š” yarn.lock ์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ yarn.lock ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•˜๋ฉฐ Docker๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๋นŒ๋“œ๊ฐ€ yarn install ๋ ˆ์ด์–ด๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— where every package is built without the cache ์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์•„๋งˆ๋„ ์ด๊ฒƒ์„ ์„ค์ •ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค).

@migueller
์˜ณ์€. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ์ƒˆ ์ข…์†์„ฑ์„ ์ž์ฃผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ตœ๋Œ€ ํ•œ ๋ฒˆ ์Šคํ”„๋ฆฐํŠธ์—๋งŒ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Docker์—์„œ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์ข…์†์„ฑ์„ ์œ„ํ•ด (์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด) ์ง€๋ถˆํ•ด์•ผ ํ•˜๋Š” ์ ์€ ๋น„์šฉ์ž…๋‹ˆ๋‹ค.

@the-spyke, ์ฐธ์œผ๋กœ. ์ด๊ฒƒ์ด ์ด ๋ฌธ์ œ๊ฐ€ ํŒจํ‚ค์ง€๋‹น ๊ฐœ๋ณ„ ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์บ์‹œ๋œ ๊ณ„์ธต์€ ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜๊ณ  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์™€ ๋…๋ฆฝ์ ์ผ ๋•Œ๋งŒ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์„ v7.0๋ถ€ํ„ฐ ์ž‘์—… ๊ณต๊ฐ„๋„ ์ง€์›ํ•˜๋Š” npm ์ž์ฒด๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ๋„ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ด€๋ จ ์ฃผ์ œ๋ฅผ ์กฐ์‚ฌํ•ด ์™”์œผ๋ฉฐ ์œ„์˜ ๋‚ด ์˜๊ฒฌ ์— ์•ฝ๊ฐ„์˜ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์ฃผ๋กœ ๊ฒฝํ—˜์ด ๋œํ•œ ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง๋ฉดํ•œ ๋ฌธ์ œ๋Š” lockfile ์˜ ์ค‘์š”์„ฑ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

"ํŠน์ • ๋ฒ„์ „์— ๋Œ€ํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์„ ์ž ๊ธˆ"๊ณ ์ •๋ผ๊ณ ; ๋ถˆํ–‰ํžˆ๋„, ๋‚ด๊ฐ€ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ํ•˜์œ„ ์ข…์†์„ฑ ์—…๋ฐ์ดํŠธ( ์—ฌ๊ธฐ ๊ธฐ์‚ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ)๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ lockfile์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ณผ๊ฑฐ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ๊นจ๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„ ์ด์ƒ์„ ๋‚ญ๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์†Œํ•œ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•œ ๋ณด์ด์ง€ ์•Š๋Š” ๋ฒ„๊ทธ๋ณด๋‹ค ๋ณ‘ํ•ฉ ์ถฉ๋Œ๊ณผ ์กฐ์ง์  ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— monorepo์—์„œ lockfile ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ—˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ๊ธฐ๋ฅผ ๋งค์šฐ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@migueller ๊ฐœ๋ณ„ ์ž ๊ธˆ ํŒŒ์ผ์€ ๊ฐœ๋ณ„ Yarn Monorepos๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Monorepo์—์„œ deps ๊ท ์ผ์„ฑ์„ ๊นจ๋œจ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— Workspace์— ๋Œ€ํ•œ ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด Yarn Monorepo์˜ ์›๋ž˜ ์•„์ด๋””์–ด์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ž‘์—… ๊ณต๊ฐ„์—์„œ ๋‹ค๋ฅธ ๋ฒ„์ „(๋˜๋Š” ์ „์ฒด ํ•˜์œ„ ํŠธ๋ฆฌ)์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ฃจํŠธ์—์„œ deps๋ฅผ ๋‹จ์ผ ๋ชฉ๋ก์œผ๋กœ ํ†ตํ•ฉ, ํ˜ธ์ด์ŠคํŒ… ๋ฐ ์ถ•์†Œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

@the-spyke ๊ทธ๋Ÿฌ๋‚˜ ์›๋ž˜ ๋ฌธ์ œ๋Š” ์ •ํ™•ํžˆ ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ์ž‘์—… ๊ณต๊ฐ„๋‹น ์ž ๊ธˆ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์ž‘์—… ๊ณต๊ฐ„๋งˆ๋‹ค ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

Monorepo์—์„œ dep ๊ท ์ผ์„ฑ์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๊นŒ? ๋ฌผ๋ก  ๊ฐœ๋ฐœ์„ ์œ„ํ•ด. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ ์ž‘์—… ๊ณต๊ฐ„์—์„œ ๊ฐ€๋ฒผ์šด ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ณต์œ  ์ข…์†์„ฑ์˜ ์ „์ฒด ๋ชฉ์ ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๊ณต์œ ๋˜๊ณ  ํ˜ธ์ด์ŠคํŠธ๋œ deps๋Š” ๊ฐœ๋ฐœ ์‹œ์—๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ๊ณต๊ฐ„์ด Docker์—์„œ ์ž‘๋™ํ•˜๋ ค๋ฉด ์ž ๊ธˆ ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@dan-cooke ๋ณด์‹œ๋‹ค์‹œํ”ผ 2018๋…„์—๋„ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ƒ๊ฐ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Docker์™€ Microservices๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜ npm ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋‚ด dependencies ์‚ฌ์–‘์— ๋”ฐ๋ผ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ •ํ•  production ์ข…์†์„ฑ ํ•˜์œ„ ํŠธ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ  Monorepos์™€ Yarn Workspaces๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์‹œ์— ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค(MS)๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋…๋ฆฝ ํ”„๋กœ์ ํŠธ. ์ผ๋ถ€ MS๋Š” ๊ฐœ๋ฐœ โ€‹โ€‹์ค‘์ด๊ณ  ์ผ๋ถ€๋Š” ๋ช‡ ๋…„ ๋™์•ˆ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ทธ๋“ค์€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. ์ด์žˆ์„ ์ˆ˜์žˆ๋‹ค UserService ์‚ฌ์šฉ [email protected] ๋ฐ MessagesService ์‚ฌ์šฉํ•˜์—ฌ [email protected] . Workspaces์˜ ํด๋”๋ฅผ node_modules ๋ฃจํŠธ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฃจํŠธ ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํŒŒ์ผ(๋ฃจํŠธ)์„ ์ƒ์„ฑํ•˜์—ฌ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Yarn ๋ฌธ์„œ์—์„œ Multirepo ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์€ "ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ฃจํŠธ ํด๋”์™€ ๋‹ค๋ฅธ ํด๋”์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

  2. Jest/Babel/etc์™€ ๊ฐ™์€ ํ†ตํ•ฉ ์ข…์†์„ฑ์„ ๊ฐ€์ง„ ํ”„๋กœ์ ํŠธ. ์ด๊ฒƒ์ด ์ž‘์—… ๊ณต๊ฐ„์ด ๋งŒ๋“ค์–ด์ง„ ์ด์œ ์ด์ง€๋งŒ MS์—๋Š” ์ถ”๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Linting ๋ฐ ํ…Œ์ŠคํŠธ์™€ ๊ฐ™์€ CI ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐœ๋ฐœ์ž ์‹œ์Šคํ…œ์—์„œ์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Yarn์ด ๋ฃจํŠธ node_modules์— ์„ค์น˜ํ•˜๊ณ  ํ‰๋ฉดํ™”ํ•œ deps. ์ถ”๊ฐ€๋กœ yarn install ๋‹จ๊ณ„๋ฅผ ์บ์‹œํ•˜์—ฌ ๋™์‹œ ๋นŒ๋“œ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ž‘์—… ๊ณต๊ฐ„์—๋งŒ deps๊ฐ€ ํ•„์š”ํ•˜๊ณ  utils ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋งํฌํ•˜๊ฑฐ๋‚˜ tarball๋กœ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ ์ž‘์—… ๊ณต๊ฐ„๋‹น ์ž ๊ธˆ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ์ž‘์—… ๊ณต๊ฐ„์„ ์ง€์ •ํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” yarn install --prod <workspace> ์™€ ๊ฐ™์€ ๋ช…๋ น์ด ์žˆ๊ณ  ํ”„๋กœ๋•์…˜ dep๋งŒ ์„ค์น˜ํ•˜๊ณ  ๋™์‹œ์— ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ์ž‘์—… ๊ณต๊ฐ„์€ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด data WS๊ฐ€ utils WS์— ์˜์กดํ•˜์ง€๋งŒ logging WS์—๋Š” ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ logging ์ž์ฒด ๋ฐ ํ•ด๋‹น deps๊ฐ€ node_modules ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๋นŒ๋“œ ํŒจํ‚ค์ง€๋ฅผ ์ €์žฅ์†Œ(npm, Arifactory, GutHub)์— ๊ฒŒ์‹œํ•˜๋Š” ๊ฒฝ์šฐ ์ž ๊ธˆ ํŒŒ์ผ์„ ์ž‘์—… ๊ณต๊ฐ„์— ๋ณต์‚ฌํ•˜๊ณ  ์—ฌ๊ธฐ์—์„œ yarn install --prod ์ˆ˜ํ–‰ํ•˜๋ฉด ์œ ์‚ฌํ•œ ๋™์ž‘์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ํŒŒ์ผ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ํŒŒ์ผ์—์„œ ๊ณผ๋„ํ•œ deps๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ฐฉ๊ธˆ ์‹œ๋„ํ•˜๊ณ  ํ•ฉ๋ฒ•์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค). Offline Mirror๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ์ข‹๊ณ  ๊ฐ•๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ Multirepos๋ฅผ ์œ„ํ•ด ์ •ํ™•ํžˆ ๊ตฌํ˜„๋œ Focused Workspaces๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๊ฐ™์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@the-์ŠคํŒŒ์ดํฌ
๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์„ ๋ณธ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ด ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑ๋˜๋Š”์ง€์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ๊ณต๊ฐ„๋‹น ์ž ๊ธˆ ํŒŒ์ผ์€ ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ํฌ์ธํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  "๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋งž๋Š”" ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

@spyke๋‹˜, ์ข‹์€ ์ ์„ ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค. Yarn ์ž‘์—… ๊ณต๊ฐ„์ด ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋ฌธ์ œ์™€ ๋Œ€๊ทœ๋ชจ ๋‹จ์ผ ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ด๋‹น ๋””์ž์ธ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ƒ๊ฐ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

.
โ””โ”€โ”€ packages
    โ”œโ”€โ”€ app1
    โ”œโ”€โ”€ app2
    โ”œโ”€โ”€ lib1
    โ”œโ”€โ”€ lib2
    โ””โ”€โ”€ lib3

lib3 ๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ app1 ๋ฐ app2 ์ข…์†๋ฉ๋‹ˆ๋‹ค. lib1 ๋Š” app1 ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๊ณ  lib2 ๋Š” app2 ์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ๋”ฐ๋ผ lib1 ๋ฐ app1 ๋Š” ์ž์ฒด ์ž ๊ธˆ ํŒŒ์ผ์ด ์žˆ๋Š” ์ž์ฒด ์ž‘์—… ๊ณต๊ฐ„์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ lib2 ๋ฐ app2 ์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค lib3 _both_ ๊ฒฝ์šฐ app1 ๋ฐ app2 ์— ์˜์กด? ๋‘ ์ž‘์—… ๊ณต๊ฐ„( app1 ๋ฐ app2 )์ด ์ž‘์—… ๊ณต๊ฐ„์— lib3 ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๊ฐ ์•ฑ์—์„œ yarn install ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Yarn์ด ์ด๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? app1 ๋ฐ app2 ๋ฅผ ๋ชจ๋‘ ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? (์•„๋งˆ๋„ app1 ๋Š” React ์•ฑ์ด๊ณ  app2 ๋Š” GraphQL API์ž„) ? ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์งˆ๋ฌธ์€ "์ด ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ธ์ด์ŠคํŒ…์˜ ์ด์ ์„ ์–ด๋–ป๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, app1 ์™€ app2 ๊ฐ€ ๋งŽ์€ ๊ณตํ†ต ์˜์กด์„ฑ์„ ๊ณต์œ ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋“ค์„ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ Yarn PnP๊ฐ€ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(ํŒŒ์ผ์„ node_modules์— ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๊ณต์œ  ์บ์‹œ๋ฅผ ๊ฐ€์ง).

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ๋‹ค์‹œ๋ณด๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋ฉด ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” Yarn ์ž‘์—… ๊ณต๊ฐ„์„ ๊ณ„์† ์ž˜๋ชป ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค...

ํŽธ์ง‘: ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ง€๊ธˆ ์ž…์žฅ์„ ๋ฐ”๊ฟจ๊ณ  Yarn ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ ์ „์ฒด ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์ž‘์—… ๊ณต๊ฐ„๋‹น ๊ฐœ๋ณ„ ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋จผ์ € ๋งˆ์Œ์— ๋– ์˜ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ์งˆ๋ฌธ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์งˆ๋ฌธ์€ "Yarn ์ž‘์—… ๊ณต๊ฐ„์ด ๋‹จ์ผ ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๊นŒ?"์ž…๋‹ˆ๋‹ค. ๋Œ€๋‹ต์€ ํ‰์†Œ์™€ ๊ฐ™์ด "๊ทธ๊ฒƒ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์ด Babel์ด๊ณ  ๋‹จ์ผ ํŒ€์ด ๋‹จ์ผ ์ €์žฅ์†Œ์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž ๊ธˆ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •์ด๋ผ๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. Yarn ์ž‘์—… ๊ณต๊ฐ„์ด ์„ค๊ณ„๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ํŒ€์ด ์žˆ๋Š” ์กฐ์ง์ด๊ณ  ๋‹จ์ผ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹จ์ผ Yarn ์ž‘์—… ๊ณต๊ฐ„ ๋ฃจํŠธ๋กœ ์ „์ฒด ๋‹จ์ผ ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋…ธ๋ ˆํฌ ๋‚ด์—์„œ Yarn์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด๋‚˜ ์—ฌ๋Ÿฌ Yarn ์ž‘์—… ๊ณต๊ฐ„ ๋ฃจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ค ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”์ง€, ๋ช‡ ํŒ€์ด ์žˆ๋Š”์ง€ ๋“ฑ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ฐ ์—”ํ„ฐํ‹ฐ(์ด ๊ฒฝ์šฐ Dockerfile์ด ์žˆ์Œ)์— ๋Œ€ํ•ด ๊ฐ ์—”ํ„ฐํ‹ฐ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ yarn install ์ˆ˜ํ–‰๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค(์ด๊ฒƒ์ด ์ž‘์—… ํ™˜๊ฒฝ ๋ฃจํŠธ์ธ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด). ์ด๊ฒƒ์€ ์ฝ”๋“œ ์†Œ์œ ๊ถŒ์— ๋Œ€ํ•œ ๋ช…ํ™•์„ฑ์„ ์ œ๊ณตํ•˜๊ณ , ๋‹ค๋ฅธ ์ผ€์ด๋˜์Šค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฉ๋ฆฌ๋œ ๋ฐฐํฌ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ , ์ž ๊ธˆ ํŒŒ์ผ ๋ฐ Docker ๋“ฑ์˜ ์บ์‹ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ค‘๋ณต๋œ node_modules ํŒจํ‚ค์ง€๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ monorepo์˜ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ์œ ํ˜•์ด๋ฉฐ Yarn ์ž‘์—… ๊ณต๊ฐ„์ด ํ˜ธ์ด์ŠคํŒ…์— ๋„์›€์ด ๋˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ monorepo ์†”๋ฃจ์…˜์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Yarn PnP๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Yarn ์—†์ด Lerna๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  --hoist ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ์ค‘์— ์ž‘์—… ๊ณต๊ฐ„์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, Yarn ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ์ „์ฒด ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ Yarn ์ž‘์—… ๊ณต๊ฐ„ ๋ฃจํŠธ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋„๊ตฌ์™€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ ํŒ€๋งˆ๋‹ค ๋‹ค๋ฅด๋ฉฐ ๋ชจ๋…ธ๋ ˆํฌ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Yarn ์ž‘์—… ๊ณต๊ฐ„์€ ์•„๋งˆ๋„ monorepo ์ž‘์—… ์‹คํ–‰๊ธฐ๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Yarn ์ž‘์—… ๊ณต๊ฐ„์„ ์•ฝ๊ฐ„ ๊ตฌ๋ถ€๋ฆฌ๋ ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ(์˜ˆ: yarn workspace ... ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์ €์žฅ์†Œ์—์„œ NPM ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰) ์ „์ฒด ๋‹จ์ผ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋‹จ์ผ ์ž‘์—… ๊ณต๊ฐ„ ๋ฃจํŠธ๋Š” ์•„๋งˆ๋„ ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๋ช…์‹ฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Babel, Jest, React ๋“ฑ์ด ์•„๋‹Œ ํ•œ ํ•„์š”ํ•œ ๊ฒƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ข…์†์„ฑ์„ ์ถ”์ ํ•˜๊ณ  CI์—์„œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝ๋œ ํ•ญ๋ชฉ๋งŒ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? Yarn ์ž‘์—… ๊ณต๊ฐ„์€ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Lerna๋Š” ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์˜ ํ† ํด๋กœ์ง€ ์ •๋ ฌ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Yarn v2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ๋กœ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋„ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž PNPM๋„ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋…ธ๋ ˆํฌ์˜ ๋ณต์žก์„ฑ์— ๋”ฐ๋ผ Bazel , Pants , Buck ๋“ฑ๊ณผ ๊ฐ™์€ (ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ) ๋นŒ๋“œ๋œ ๋„๊ตฌ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@migueller ๊ท€ํ•˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ฅด๋ฉด ์—„๊ฒฉํ•˜๊ฒŒ ๋…๋ฆฝ์ ์ธ ํŒจํ‚ค์ง€๋‚˜ ๊ธฐํƒ€ ์ด๊ตญ์ ์ธ ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋” ์–‡์€ ๊ฐœ๋ฐœ์ž ์„ค์น˜๋„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ผ๋ฐ˜ Yarn Monorepo: ๋‹จ์ผ ๋ฃจํŠธ ๋ฐ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ์‹œ๊ฐ„์ด ๋นจ๋ผ์ง€๊ณ  ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ค๋ฉฐ app1 ๋Š” ๋กœ์ปฌ ๋งํฌ lib1 ๋ฐ lib3 ํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋‹จ์ ์€ lib1 devDep์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ณต์œ  yarn.lock ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— CI ์บ์‹œ ๋ฌดํšจํ™”๊ฐ€ ๋” ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ์ ˆ์ถฉ์•ˆ์„ ๋งŽ์ด ๊ฑฑ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ข…์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

lib1 ๋Š” lodash@^4.5.0" and lib2 may depend on lodash@^4.10.0"์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Monorepo์˜ ๊ฒฝ์šฐ lodash ์˜ ๋‹จ์ผ ๋ฒ„์ „์ด ์‚ฌ์šฉ๋˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ Yarn์€ ๋ฃจํŠธ node_modules์— ์˜ฌ๋ ค์ง„ ` [email protected] "์™€ ๊ฐ™์€ ๋‘ ์ง€์ •์ž์™€ ํ˜ธํ™˜๋˜๋Š” ์ตœ์‹  ๋ฒ„์ „์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ์˜ ๊ฒฝ์šฐ ๋‹จ์ผ ํ†ตํ•ฉ ๋ฒ„์ „์„ ์—…๋ฐ์ดํŠธํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์ž‘์—… ๊ณต๊ฐ„์ด ํ•ญ์ƒ ๊ฐ™์€ ํŽ˜์ด์ง€์— ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›ํ•˜๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค.

๋…๋ฆฝ์ ์ธ ํŒ€์ด ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์ƒํ™ฉ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ proj1 ๋Š” proj2 ์— [email protected] ์žˆ๋Š” [email protected] ์— ๋จธ๋ฌผ๊ณ  ์ž์‹ ์˜ ์ผ€์ด๋˜์Šค๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  lodash@~4.5.0 ์™€ ๊ฐ™์€ ๋ณด๋‹ค ์—„๊ฒฉํ•œ ์ง€์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ 2๋‹จ๊ณ„ ์ข…์†์„ฑ์„ ๋„ˆ๋ฌด ์ผ์ฐ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ฒด์ ์œผ๋กœ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ์™„์ „ํžˆ ๊ด€๋ จ์ด ์—†์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•˜๋‚˜์˜ git repo ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Yarn Monorepo๋กœ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ๊ณต์œ  ์ž ๊ธˆ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋…๋ฆฝ์„ฑ์„ ์ ˆ์ถฉํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋Œ€ํ•˜์„ธ์š”. ๋…๋ฆฝ์ ์ธ ์‚ถ์ด ์žˆ๋Š” ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ Multirepo๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Unix์—์„œ ๋ชจ๋“  ๋””๋ ‰ํ† ๋ฆฌ๋Š” / ์— ์žˆ์ง€๋งŒ PC์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  JS ํ”„๋กœ์ ํŠธ๊ฐ€ Monorepo์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค :-)

ํ”„๋กœ๋•์…˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ์ตœ์†Œํ•œ์˜ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์€ Yarn๊ณผ ์™„์ „ํžˆ ๊ด€๋ จ์ด ์—†์ง€๋งŒ Yarn์ด yarn.lock ๋ผ๋Š” ๊ฐœ๋ฐœ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์ž‘์—…๋„ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@the-spyke, ์ด ์˜ˆ์—์„œ๋Š” 3๊ฐœ์˜ ์ž‘์—… ์˜์—ญ๋งŒ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์‹ค์ œ ์ €์žฅ์†Œ์—๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋ฐฐํฌ๋œ ์›Œํฌ๋กœ๋“œ๊ฐ€ ์กฐํ•ฉ๋œ 20๊ฐœ ์ด์ƒ์˜ ์ž‘์—… ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง€๊ธˆ ๋ณด๋Š” ๋ฐฉ์‹์€ ๋…๋ฆฝ์ ์ธ ์ž ๊ธˆ ํŒŒ์ผ์ด ์žˆ๋Š” ์—ฌ๋Ÿฌ Yarn ์ž‘์—… ๊ณต๊ฐ„ ๋ฃจํŠธ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์•„๋งˆ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” monorepo(๋˜๋Š” multirepo๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ)๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ถ„๋ฆฌ ๋‹จ์œ„๋กœ ์ „๊ฐœ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ๊ธˆ ํŒŒ์ผ๊ณผ ์ž˜ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ์ด ์ž‘์—…์ด ๋งค์šฐ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์ด์œ ๋Š” ์ดˆ๊ธฐ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์–ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Yarn ์ž‘์—… ์˜์—ญ์ด ์ž‘์—… ์˜์—ญ ๋ฃจํŠธ ์™ธ๋ถ€์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "workspaces": [
    "../lib1",
    "../lib3"
  ]
}

@migueller ์™€ ๋™์ผํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์œผ๋ฉฐ ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์•„์ด๋””์–ด๋Š” Yarn์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์ž‘์—… ๊ณต๊ฐ„ ์„ธํŠธ ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

{
  "workspaces": {
    "frontend-app": ["frontend", "common"],
    "backend-app": ["backend", "common"]
  }
}

Yarn์€ ๋‘ ๊ฐœ์˜ ์ถ”๊ฐ€ ์ž ๊ธˆ ํŒŒ์ผ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ yarn.lock ๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค).

.
โ””โ”€โ”€ monorepo/
    โ”œโ”€โ”€ yarn.frontend-app.lock
    โ”œโ”€โ”€ yarn.backend-app.lock
    โ””โ”€โ”€ packages/
        โ”œโ”€โ”€ frontend
        โ”œโ”€โ”€ backend
        โ””โ”€โ”€ common

ํ”„๋ก ํŠธ์—”๋“œ์šฉ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ์ปจํ…์ŠคํŠธ(์˜ˆ: tar ๋ฅผ ํ†ตํ•ด )๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

.
โ””โ”€โ”€ <Docker build context>/
    โ”œโ”€โ”€ yarn.frontend-app.lock
    โ””โ”€โ”€ packages/
        โ”œโ”€โ”€ frontend
        โ””โ”€โ”€ common

๋‚ด๊ฐ€ ๊นŠ์ด ์ƒ๊ฐํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์ž ๊ทธ๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „์˜ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€( node_modules ๋งํฌ)์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆœ์ „ํžˆ ๋†’์€ ์ˆ˜์ค€์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด 2์ฐจ์› Yarn ์ž‘์—… ๊ณต๊ฐ„์ด ์•„๋งˆ๋„ ์šฐ๋ฆฌ๊ฐ€ ์ถ”๊ตฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

( ์—ฌ๊ธฐ์—๋„ ๋น„์Šทํ•œ ๊ธ€์ด ์˜ฌ๋ผ

์ž‘์—… ๊ณต๊ฐ„๋‹น ์ž ๊ธˆ ํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์ž‘์—… ๊ณต๊ฐ„๋‹น node_modules๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@gfortaine , ํ† ๋ก ์„ ์ฝ์œผ๋ฉด ์‹ค์ œ๋กœ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ฐ–๋Š” ์ด์œ ๋Š” ์„ค์น˜์™€ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ๋Œ€์‹  ํŠน์ • ํŒจํ‚ค์ง€๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ž ๊ธˆ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ ์ž ๊ธˆ ํŒŒ์ผ์€ _๋ชจ๋“ _ ์ž‘์—… ๊ณต๊ฐ„ ์ข…์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€๋งŒ ๋‹จ์ผ ํŒจํ‚ค์ง€๋กœ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ์ž ๊ธˆ ํŒŒ์ผ์€ _ํ•ด๋‹น_ ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์€ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. @yarnpkg/lockfile ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ƒ์œ„ ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ณ  yarn workspaces info ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—… ๊ณต๊ฐ„ ์ข…์†์„ฑ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋ฅผ ๊ฐ ์ž‘์—… ๊ณต๊ฐ„์˜ package.json ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ๊ณต๊ฐ„๋‹น ์ž ๊ธˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ €์žฅ์†Œ์— postinstall ์Šคํฌ๋ฆฝํŠธ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฐœ๋ณ„ ์ž ๊ธˆ ํŒŒ์ผ์„ ์ตœ์ƒ์œ„ ์ˆ˜์ค€ ํŒŒ์ผ๊ณผ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๋‚ด ๋ฐœ๊ฒฌ์œผ๋กœ ๋‹ค์‹œ๋ณด๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pnpm: @pnpm/make-dedicated-lockfile ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ๊ตฌํ˜„์„ ๋ฐฉ๊ธˆ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค ๐Ÿ‘

์ด ๋™์ž‘(์ž‘์—… ๊ณต๊ฐ„๋‹น ๋ฒ„์ „ ๊ด€๋ฆฌ, ๊ฐ ํŒจํ‚ค์ง€์— ์—ฌ์ „ํžˆ ์ž ๊ธˆ ํŒŒ์ผ์ด ์žˆ์Œ)์— ๋Œ€ํ•œ ๋‚˜์˜ ํ•„์š”๋Š” ํ•˜์œ„ ํŠธ๋ฆฌ๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ €์žฅ์†Œ๋กœ ๋‚ด๋ณด๋‚ด์ง€๋Š” ์ค‘์ฒฉ๋œ ๋‹จ์ผ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ lerna/npm๊ณผ ์ผ๋ถ€ ์‚ฌ์šฉ์ž ์ง€์ • ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„์ „์„ ๊ณ ๋ฅด๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์›์‚ฌ(์ค‘์ฒฉ ์ง€์›์ด ์žˆ๋Š” ๊ณณ์—์„œ v2๋กœ ์ถ”์ธก)๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ „์—ญ ๊ณ ์ •์˜ ์˜ฌ๋ฐ”๋ฅธ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๊ฐ๊ฐ ๋‚จ๊ฒจ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ค์น˜ ํ›„ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ž ๊ธˆ ํŒŒ์ผ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์–ด๋Š ์ชฝ์ด๋“  ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰