Monorepo and Lerna

#lerna
#npm
#yarn
Suggest Edit

์ œ๊ฐ€ ๋งŒ๋“  Remark Math๋ฅผ ๋ฐฐํฌํ•˜๋ฉด์„œ ๋ชจ๋…ธ๋ฆฌํฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด [Lerna]๋ฅผ ์‚ฌ์šฉํ•œ ๋…ธํ•˜์šฐ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

์šฉ์–ด ์„ค๋ช…

๋ชจ๋…ธ๋ฆฌํฌ(Monorepo)?

๊ฐ€๋ น ๋ฐ”๋ฒจ๊ณผ ๊ฐ™์ด ๋ณต์ˆ˜์˜ ํŒจํ‚ค์ง€๊ฐ€ ์„œ๋กœ ์—ฐ๊ณ„๋˜์„œ ํ™œ์šฉ๋˜๋Š” ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ, ๊ฐ๊ฐ์˜ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋กœ ๋งŒ๋“ค๋ฉด ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํŒจํ‚ค์ง€๊ฐ„์˜ ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋งค๋ฒˆ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋‹ค๋‹ˆ๋ฉด์„œ ํ™•์ธ์„ ํ•ด์•ผํ•˜๊ณ  ๋งค๋ฒˆ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋”ฐ๋กœ๋”ฐ๋กœ ๋ฐฐํฌํ•ด์•ผํ•˜๊ฒ ์ฃ ...

์ด๋ฅผ ์œ„ํ•œ ๋Œ€์ฑ…์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ชจ๋…ธ๋ฆฌํฌ์ธ๋ฐ, ํ•˜๋‚˜์˜ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์— ๋ณต์ˆ˜์˜ ํŒจํ‚ค์ง€๋ฅผ ๋‘๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ์™€ ๋ฐ”๋ฒจ์—์„œ ์ฃผ๋กœ ํ™œ์šฉ๋˜๊ณ  ์žˆ๊ณ , Remark Math์˜ ๊ฒฝ์šฐ๋„ ์ˆ˜์‹ ํŒŒ์„œ ํ™•์žฅ๊ณผ ๋ Œ๋”๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๋ชจ๋…ธ๋ฆฌํฌ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

Why is Babel a monorepo? - Babel

[Lerna]?

๋ชจ๋…ธ๋ฆฌํฌ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” CLI ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

Git์˜ ์ปค๋ฐ‹์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ํŒจํ‚ค์ง€๋งŒ ์ผ๊ด„์ ์œผ๋กœ NPM์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋™์‹œ์— ๋ฆฌ๋ชจํŠธ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๊นŒ์ง€ ํ‘ธ์‹œํ•ด์ค๋‹ˆ๋‹ค. ์•„์ง ๋ฒ ํƒ€๋ฒ„์ ผ์ด๊ธดํ•ด๋„ ๋งค์šฐ๋งค์šฐ ํŽธ๋ฆฌํ–ˆ์–ด์š”. :100::100:

์‚ฌ์šฉ๋ฒ•

lerna init

์šฐ์„ , Git์˜ ๋ณ€๊ฒฝ์ ์„ ํ†ตํ•ด ํŒจํ‚ค์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Git์ด ์ดˆ๊ธฐํ™” ๋˜์–ด์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค.

git init

๊ทธ๋ฆฌ๊ณ , Lerna๋ฅผ ๊ธ€๋กœ๋ฒŒ๋กœ ์„ค์น˜์™€ ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

npm i -g lerna
lerna init -i

-i ํ”Œ๋ž˜๊ทธ๋Š” --independent์˜ ์–ผ๋ผ์ด์–ด์Šค๋กœ, ๊ฐ๊ฐ์˜ ํŒจํ‚ค์ง€์˜ ๋ฒ„์ ผ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์—†์ด ๊ธฐ๋ณธ์ƒํƒœ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ์‹œํ‚ค๋ฉด ํ•˜๋‚˜์˜ ๋ฒ„์ ผ์œผ๋กœ ๋ชจ๋‘๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Babel ์—ญ์‹œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋ฅผ ๋งˆ์น˜๋ฉด lerna.json์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "lerna": "2.0.0-beta.38",
  "packages": ["packages/*"],
  "version": "independent"
}

lerna๋Š” ์‚ฌ์šฉ์ค‘์ธ Lerna์˜ ๋ฒ„์ ผ์ด์—์š”. Lerna๊ฐ€ ์•„์ง ๋ฒ ํƒ€์ด์–ด์„œ ์„ค์ •์ด ์–ธ์ œ ๋ฐ”๋€”์ง€ ๋ชจ๋ฅด๊ธฐ์— ์‚ฌ์šฉํ•˜๋Š” CLI์™€ ์„ค์ •์˜ ๋ฒ„์ ผ์ด ํ•ญ์ƒ ๋™์ผํ•  ๊ฒƒ์„ ์š”๊ตฌํ•˜๊ณ  ์žˆ์–ด์š”.

packages๋Š” ๊ฐ๊ฐ์˜ ํŒจํ‚ค์ง€๋“ค์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

version์€ -i ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„ฃ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— independent๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์œผ๋ฉด ๊ทธ๋ƒฅ ๋ฒ„์ ผ์ด ๋“ค์–ด๊ฐ€์š”.

์ด์ œ ๊ฐ๊ฐ์˜ ํŒจํ‚ค์ง€๋Š” packages/some-packageํ˜•์‹์œผ๋กœ ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ฐ๊ฐ์˜ ํŒจํ‚ค์ง€๋งˆ๋‹ค package.json์„ ์ƒ์„ฑํ•ด์ฃผ์…”์•ผ ํ•ด์š”!

lerna bootstrap

npm install์„ ๊ฐ๊ฐ์˜ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์ผ๊ด„์ ์œผ๋กœ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.

๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ package.json์— postinstall๋กœ ์ถ”๊ฐ€ํ•ด๋‘๋ฉด ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

{
  "scripts": {
    "postinstall": "lerna bootstrap"
  }
}

lerna publish

npm publish๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์‹คํ–‰ํ•ด ์ค๋‹ˆ๋‹ค. ์ปค๋ฐ‹์„ ํ™•์ธํ•ด์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋œ ํŒจํ‚ค์ง€๋งŒ ๋ฐฐํฌ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ํŽธ๋ฆฌํ–ˆ๋˜๊ฑด ๋Œ€ํ™”ํ˜•์‹์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฒ„์ ผ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์ด์—ˆ์–ด์š”.

? Select a new version for remark-math (currently 0.2.0) (Use arrow keys)
โฏ Patch (0.2.1)
  Minor (0.3.0)
  Major (1.0.0)
  Custom

๊ทธ๋ฆฌ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋”๋ธ”์ฒดํฌ๊นŒ์ง€ ํ•ด์ค๋‹ˆ๋‹ค.

Changes:
- rehype-katex: 0.2.0 => 0.2.1
- remark-html-katex: 0.2.0 => 0.2.1
- remark-math: 0.2.0 => 0.2.1

? Are you sure you want to publish the above changes?

์™„๋ฃŒํ•˜๋ฉด ๋ฒ„์ ผ๋ถ€๋ถ„์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ปค๋ฐ‹๊ณผ ํŒจํ‚ค์ง€๋ณ„๋กœ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋“ฑ๋ก๋œ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋กœ ํ‘ธ์‹œ๊นŒ์ง€ ํ•ด์ค˜์š”. ์ •๋ง ํŽธ๋ฆฌํ•ด์š”! :smile:

ํŒ & ์ฃผ์˜์‚ฌํ•ญ

๊ฐ๊ฐ์˜ ํŒจํ‚ค์ง€์˜ package.json์—์„œ devDependencies์™€ scripts๋Š” ํ•„์š”์—†๋‹ค?

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

๊ณ ๋กœ, ์ €์˜ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๋“ค์€ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ package.json์— ๋„ฃ์–ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ package.json์—์„  dependencies์™€ version๊ฐ€ ํ•„์š”์—†๋‹ค?

๋ฃจํŠธ๋””๋ ‰ํ† ๋ฆฌ๋Š” ํผ๋ธ”๋ฆฌ์‹œ๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์—, dependencies๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , version์„ ๋ฏธ๋ฆฌ ์ง€์›Œ๋‘๋Š” ๊ฒƒ๋„ ์ƒ๋‹นํžˆ ์ข‹์€ ๋ฒ„๋ฆ‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. ์‹ค์ˆ˜๋กœ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ npm publish ๋ช…๋ น์„ ์‹คํ–‰ํ•ด๋ฒ„๋ ค๋„ version์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌ๊ฐ€ ์›์ฒœ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ์‹œ ํƒœ๊น…๊ณผ TravisCI

์—„๋ฐ€ํ•˜๊ฒŒ ๋งํ•˜๋ฉด TravisCI๊ฐ€ ๋‚˜์œ๊ฑด๋ฐ.... ๋ฐฐํฌ์‹œ ํŒจํ‚ค์ง€๋ณ„๋กœ ํƒœ๊น…์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— TravisCI๊ฐ€ ํƒœ๊ทธ๋ณ„๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๋Œ๋ ค์š”..๐Ÿ˜ฃ ๐Ÿ˜ฃ (๋ถ„๋ช… ์ปค๋ฐ‹์˜ ํ•ด์‹œ๊ฐ€ ์ผ์น˜ํ•จ์—๋„ ๋ถˆ๊ตฌํ•œ๋ฐ๋„ ๋ง์ด์ฃ ...)

Travis tag handling

์ผ๋‹จ์€ ๋Œ€์ฒ˜๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€์‹œํ‚ค๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • --skip-git : ์ด ๊ฒฝ์šฐ ๊นƒ์˜ ์กฐ์ž‘์—†์ด ๋ฐฐํฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ ๋ณ€๊ฒฝํ›„ ์ง์ ‘ ์ปค๋ฐ‹/ํ‘ธ์‹œ๋ฅผ ํ•ด์ฃผ์…”์•ผํ•ฉ๋‹ˆ๋‹ค.
  • -m "[ci skip]" : ์ปค๋ฐ‹๋ฉ”์„ธ์ง€๋ฅผ ๋ฎ์–ด์จ์„œ CI๋ฅผ ์ƒ๋žต์‹œํ‚ต๋‹ˆ๋‹ค.

npmjs.com์—์„œ์˜ readme.md ํ‘œ์‹œ

npmjs.com๋Š” ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ package.json์˜ name๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ํŒจํ‚ค์ง€์— ํ•œํ•ด์„œ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ readme.md๋ฅผ ํ•ด๋‹น ํŒจํ‚ค์ง€์˜ ๋ฌธ์„œ๋กœ ๊ฐ€์ ธ์™€์š”. ๊ณ ๋กœ, ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์€ ๋‹ค ๋”ฐ๋กœ๋”ฐ๋กœ readme.md๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๋™์ผํ•œ ์ด๋ฆ„์˜ ํŒจํ‚ค์ง€์—๋„ readme.md๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๋ฃจํŠธ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€์ชฝ ๋ฌธ์„œ๋ฅผ ์šฐ์„ ํ•ด์„œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ง์ด ๋ณต์žกํ•˜๋‹ˆ Remark Math์˜ ๊ฒฝ์šฐ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

/readme.md # remark-math์˜ ๋ฌธ์„œ
/packages/remark-html-katex/readme.md # remark-html-katex์˜ ๋ฌธ์„œ
/packages/rehype-katex/readme.md # rehype-katex์˜ ๋ฌธ์„œ

๋งŒ์•ฝ์— packages/remark-math/readme.md๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ๋ฐ”๋€๋‹ˆ๋‹ค.

/readme.md # npmjs.com์—์„œ๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!
/packages/remark-math/readme.md # remark-math์˜ ๋ฌธ์„œ
/packages/remark-html-katex/readme.md # remark-html-katex์˜ ๋ฌธ์„œ
/packages/rehype-katex/readme.md # rehype-katex์˜ ๋ฌธ์„œ

npm ๋Œ€์‹  yarn

2.0.0-beta.38 ๋ฒ„์ ผ ๋ถ€ํ„ฐ lerna.json์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •์„ ํ•˜๋ฉด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  "npmClient": "yarn"

yarn.lock์€ .gitignore์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑธ๋กœ ๊ฐ์ถœ ์ˆ˜ ์žˆ๋Š” ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

packages/*/yarn.lock