An open API service indexing awesome lists of open source software.

https://github.com/dl0312/monorepo-tutorial

๐Ÿ‘ถ It's time to study mono-repo
https://github.com/dl0312/monorepo-tutorial

Last synced: 15 days ago
JSON representation

๐Ÿ‘ถ It's time to study mono-repo

Awesome Lists containing this project

README

        

# โ˜๏ธ Monorepo tutorial

# Monorepo๋ž€?
๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ์„ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

`Monorepo`๋ฅผ ์“ธ ์ƒํ™ฉ์ด ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ? ์ผ๋‹จ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ๋Š” ํ”„๋ก ํŠธ ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” ๊ฐ ํ”„๋กœ์ ํŠธ์—์„œ NPM ๋ชจ๋“ˆ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์›น๊ณผ ์•ฑ์„ ๋งŒ๋“ค๋•Œ ์›น ํ˜น์€ ์•ฑ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋กœ์ง ํ˜น์€ ๋ชจ๋“ˆ์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด `Monorepo`๋ฅผ ์“ฐ๊ธฐ๋„ํ•œ๋‹ค.

## Monorepo์˜ ์žฅ์ 
**ํ†ต์ผ์„ฑ**์ด ์ƒ๊ธด๋‹ค - ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ๊ด€๋ฆฌ๋  ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋กœ์ง์„ ๋ณด๊ฒŒ๋  ๊ธฐํšŒ๊ฐ€ ๋งŽ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ํ†ต์ผ๋˜์ง€ ์•Š๊ณ  ์ค‘๊ตฌ๋‚œ๋ฐฉ์ด ๋œ๋‹ค. ์—ฌ๋Ÿฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ๊ด€๋ฆฌ๋  ๊ฒฝ์šฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๊ฐ€ ์ˆ˜์‹ญ๊ฐœ๊ฐ€ ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ๋˜ํ•œ `lerna`๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฐ˜๋ณต์—†์ด ์œ ์ผํ•œ `npm` ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋˜ํ•œ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

# yarn-workspaces

## ์‚ฌ์šฉ๋ฒ•
๋”ฐ๋กœ npm ์„ค์น˜ํ•  npm package๋Š” ์—†๋‹ค.
`package.json` ํŒŒ์ผ์— `workspaces`๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์„ค์ •์€ ๋งˆ๋ฌด๋ฆฌ๋œ๋‹ค.

์—ฌ๋Ÿฌ `package`๋“ค์„ `packages`๋ผ๋Š” ํด๋”์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๋‹ค.

๋‹ค์Œ์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋ณดํ†ต @๋’ค์— `organization`์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฆ„์„ `prefix`๋กœ ๋ถ™์—ฌ์„œ ๊ฐ ํŒจํ‚ค์ง€์„ ์ด๋ฆ„์ง“๋Š”๋‹ค.
```json
{
"name": "@walnut/iloveyou3000",
...
}
```

## ํŠน์ง•
`packages`์‚ฌ์ด์—์„œ๋Š” ์„œ๋กœ๋ฅผ `npm` ํŒจํ‚ค์ง€์ฒ˜๋Ÿผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

```json
{
"name": "@walnut/server",
"version": "1.0.2",
"main": "index.js",
"license": "MIT",
"dependencies": {
"@walnut/common": "^1.0.1",
"graphql-yoga": "^1.14.7"
},
"scripts": {
"test": "echo testing server with version: $npm_package_version"
}
}
```
๋ฌผ๋ก  ํ•ด๋‹น ํŒจํ‚ค์ง€ ์•ˆ์—์„œ ๋ถˆ๋Ÿฌ์˜จ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
```js
const commonFunction = require('@walnut/common')
commonFunction()
```

# lerna
[lerna](https://github.com/lerna/lerna) - ๐Ÿ‰ A tool for managing JavaScript projects with multiple packages.

์œ„์— ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์˜์กด์„ฑ์„ ๋ฌถ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ฐ ํŒจํ‚ค์ง€๋ณ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋„์™€์ค€๋‹ค.

`yarn-workspaces`์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ ค๋ฉด `lerna.json`์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ์–ด์ฃผ์–ด์•ผํ•œ๋‹ค.
```json
{
...
"npmClient": "yarn",
"useWorkspaces": true,
...
}
```

## ์ปค๋งจ๋“œ
```shell
$ lerna bootstrap
```
์—ฌ๋Ÿฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์˜์กด์„ฑ์„ ๋ฌถ์–ด์„œ ๊ฐ ํŒจํ‚ค์ง€๋ณ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ค‘๋ณต์ด ์—†๊ฒŒ ์„ค์น˜ํ•ด์ค€๋‹ค.

## References
* ๐Ÿ“น[How to Use Lerna](https://www.youtube.com/watch?v=p6qoJ4apCjA)
* ๐Ÿ“น[Better code sharing through monorepos?](https://www.youtube.com/watch?v=0_qhdOeMuhk)
* ๐Ÿ“น[Marcel Cutts - MonoRepos for the Masses | ReactNext 2018](https://www.youtube.com/watch?v=rdeBtjBNcDI)
* ๐Ÿ“น[Uber Technology Day: Monorepo to Multirepo and Back Again](https://www.youtube.com/watch?v=lV8-1S28ycM)
* ๐Ÿ“น[Jacob Bass: Modularity and Monorepositories](https://www.youtube.com/watch?v=7Lr8xYPKG5w)
* ๐Ÿ“น[Yarn Workspaces Tutorial](https://youtu.be/G8KXFWftCg0) by Ben Awad