All Articles

Yarn workspace ๋„์ปค ์ด๋ฏธ์ง€ ์บ์‹ฑ

๋ชจ๋…ธ๋ฆฌํฌ์— ๋Œ€ํ•ด์„œ๋Š” Rokt33r - Monorepo and Lerna์—์„œ ์„ค๋ช…์„ ์ž˜ ํ•ด์ฃผ๊ณ  ์žˆ๊ณ , ์ด ๊ธ€์€ Yarn workspace๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€์ •.

๋ฌธ์ œ

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

๋ฐฉ๋ฒ•๋“ค

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ๊น”์•„์•ผ ํ•  ํŒจํ‚ค์ง€๊ฐ€ ๊ฐ™๋‹ค๋ฉด ํŒจํ‚ค์ง€๋ฅผ ์ƒˆ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

  1. **/node_modules๋ฅผ ์บ์‹œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

Caching Yarn workspaces on CircleCI๋ผ๋Š” ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์—์„œ ๋ณธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ตœ์ƒ๋‹จ์˜ node_modules ํด๋”๋งŒ ์บ์‹ฑํ•˜์ง€ ๋ง๊ณ  ๊ฐ ํŒจํ‚ค์ง€ ์•ˆ์— ๋“ค์–ด์žˆ๋Š” node_modules๋“ค๋„ ํ•จ๊ป˜ ์บ์‹ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค (๋ฌผ๋ก  yarn.lock์ด ๋ฐ”๋€Œ๋ฉด ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”). CircleCI ์ฒ˜๋Ÿผ ์บ์‹ฑํ•  ํด๋”๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ๋˜ workspace ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค๋ฉด ๊ฐ€์žฅ ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ๋‹ค๋งŒ ๋„์ปค์—์„œ ๋น„์Šทํ•œ ๋Š๋‚Œ์„ ๋‚ด๋ ค๊ณ  ์ผ๋‹จ ํŒจํ‚ค์ง€ ์ „์ฒด๋ฅผ ์„ค์น˜ํ•˜๊ณ , **/node_modules๋งŒ ๋ณต์‚ฌํ•ด์„œ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์„ ํ•ด๋ณด๊ณ  ์žˆ๋Š”๋ฐ ๋ณต์‚ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ญ”๊ฐ€ ๋งํฌ๊ฐ€ ๊นจ์ง€๋Š”์ง€ ์ž˜ ์•ˆ ๋ฌ๋‹ค. ์•„๋‹ˆ๋ฉด ์•„์˜ˆ ํด๋”๋ฅผ ์˜ฎ๊ธฐ์ง€ ๋ง๊ณ  ์†Œ์Šค๋งŒ ์ง€์šฐ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ ์ด๊ฑด ํ•ด๋ณด๊ณ ์„œ ์—…๋ฐ์ดํŠธ.

  1. **/package.json์ด๋ž‘ yarn.lock๋งŒ ๋ณต์‚ฌํ•ด์„œ ๋„์ปค ๋ ˆ์ด์–ด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ

Caching strategy for dependencies with Docker - lerna/lerna#858์—์„œ ๋ณธ ๊ฒƒ์œผ๋กœ, ๋„์ปค์—์„œ ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ์ฒดํฌ์„ฌ์ด ๊ฐ™์•„์•ผ ๋ ˆ์ด์–ด๊ฐ€ ์žฌํ™œ์šฉ์ด ๋œ๋‹ค๋Š” ์ ์„ ์ด์šฉํ•ด์„œ ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ ๋Œ€์‹  yarn.lock์ด๋ž‘ package.json, ๊ทธ๋ฆฌ๊ณ  ๊ฐ workspace์˜ package.json๋งŒ ๋ณต์‚ฌํ•ด์„œ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌ๋ฉด ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ € ํŒŒ์ผ๋“ค์ด ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฉด ์˜์กด์„ฑ์ด ์„ค์น˜๋œ ์ƒํƒœ๊นŒ์ง€์˜ ๋„์ปค๊นŒ์ง€๋Š” ์žฌ์‚ฌ์šฉ์ด ๋˜๋‹ˆ๊นŒ ์ด๋ฏธ์ง€ ๋งŒ๋“œ๋Š” ์†๋„๊ฐ€ ํ›จ์”ฌ ๋นจ๋ฆฌ์ง„๋‹ค. ์ด๊ฒƒ๋„ ๋”ฐ๋ผํ•ด ๋ดค๋Š”๋ฐ ์ €๋ ‡๊ฒŒ๋งŒ ๋ณต์‚ฌํ•ด์„œ๋Š” ์•„์˜ˆ yarn ๋ช…๋ น์–ด๋กœ ์„ค์น˜๊ฐ€ ์•ˆ๋˜์—ˆ๋‹ค.

(5/16) ์˜ค๋Š˜ 2๋ฒˆ์„ ๋‹ค์‹œ ํ•ด๋ดค๋Š”๋ฐ ์„ค์น˜๊ฐ€ ์•ˆ๋˜๋Š”๊ฑด package.json, tsconfig ๋“ฑ์— ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์ ์–ด์ฃผ์ง€ ์•Š์•„์„œ ๊ทธ๋žฌ๊ณ  ์ž˜ ์ ์–ด์ฃผ๋‹ˆ๊นŒ ๊น”๋”ํ•˜๊ฒŒ ์ž˜ ๋˜์—ˆ๋‹ค. ์•„๋ž˜ ์จ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋น„ํ•ด์„œ ๊ด€๋ฆฌ๋„ ํŽธํ•˜๊ณ  ์†๋„๋„ ๋น ๋ฅด๊ณ  ์—ฌ๋ ค๋ชจ๋กœ ๋งŒ์กฑ.

์•„์‰ฌ์šด๋Œ€๋กœ ์ผ๋‹จ ์ „์ฒด ์„ค์น˜ํ•œ ์ด๋ฏธ์ง€๋ฅผ base๋กœ ์‚ผ์•„์„œ ๊ทธ ์œ„์—์„œ ์ƒˆ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฐ›๊ณ , yarn์„ ๋Œ๋ ค์„œ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์œผ๋ฉด ์ƒˆ๋กœ ๋ฐ›๋Š” ๊ฒƒ๋„ ๋‚˜๋ฆ„ ๋ฐฉ๋ฒ•์ด ๋˜๋Š”๋ฐ, ์•ˆ ์“ฐ๋Š” ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๊ฒƒ์ด ๋ญ”๊ฐ€ ์ฐœ์ฐœํ•ด์„œ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค. 1์ด๋‚˜ 2์ค‘์—์„œ ์ž˜ ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์„œ ์ด ํฌ์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

Published May 1, 2019

If I keep marking the dots, someday they will ๐Ÿ”—๐Ÿ”—