Yarn
Yarn์ ์๋ฐ์คํฌ๋ฆฝํธ ํจํค์ง ๋งค๋์ ๋ค. Yarn์ npm์ ๋ํ ๋นํ์ผ๋ก๋ถํฐ ์ถ๋ฐํ๋ค. 2017๋
๋ฆด๋ฆฌ์ฆ๋ Yarn 1์ yarn.lock ํ์ผ์ ์ด์ฉํ ์ข
์์ฑ ํธ๋ฆฌ ๊ณ ์ , ์บ์๋ฅผ ํตํ ์๋ ํฅ์ ๋ฑ npm๋ณด๋ค ๊ฐ์ ๋ ํจํค์ง ๊ด๋ฆฌ ํ๊ฒฝ์ ์ ๊ณตํ๋ค. ์ดํ 2020๋
๋ฆด๋ฆฌ์ฆ๋ Yarn 2๋ Berry ๋๋ Yarn Berry๋ก ๋ถ๋ฆฌ๋ฉฐ, PlugโnโPlay(PnP) ์ํคํ
์ฒ๋ฅผ ๋์
ํด node_modules
๋๋ ํ ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๊ณ , ๊ฐ ์์กด์ฑ์ ์์น์ ๋ฒ์ ์ .pnp.js
ํ์ผ๋ก ์ถ์ ํจ์ผ๋ก์จ ๋์ฑ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ฌ์ฑํ๋ค.
Workspaces
์ํฌ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ ํ๋ก์ ํธ ๋ด์์ ์ฌ๋ฌ ํจํค์ง๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค. ํนํ ์ด๋ ๋ชจ๋
ธ๋ ํฌ์์ ๋งค์ฐ ์ ์ฉํ๋ค. ๋ชจ๋
ธ๋ ํฌ์ ํจํค์ง๋ ์๋ก ์ข
์๋์ด์ผ ํ๋ ์ํฉ์ด ๋ง์๋ฐ, ๊ฐ๋ น ์ ํ๋ฆฌ์ผ์ด์
ํจํค์ง(app
)๊ฐ ๊ฐ์ ์ ์ฅ์์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจํค์ง(utils
)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ Yarn์ ํ๋ก์ ํธ์์ ์ํฌ์คํ์ด์ค๋ฅผ ์ฌ์ฉํด ์์กด์ฑ์ ์ฐพ์ ์ ์๋ค.
{
"name": "app",
"dependencies": {
"utils": "workspace:^"
}
}
yarn workspaces focus
๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ํน์ ์ํฌ์คํ์ด์ค์๋ง ์์กด์ฑ์ ์ค์นํ ์ ์๋ค. ๋ํ yarn workspaces foreach
๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ํฌ์คํ์ด์ค์์ ๋ช
๋ น์ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๋ค.
Constraints
์ ์ฝ์ ์ฌ์ฉํ๋ฉด ์ํฌ์คํ์ด์ค์ ํน์ ๊ท์น์ ์ ์ฉํ ์ ์๋ค. ๊ฐ๋ น ๋์ผํ ๋ฒ์ ์ ์์กด์ฑ์ ๋ณด์ฅํ๊ฑฐ๋, ํน์ ์์กด์ฑ ์ฌ์ฉ์ ๊ธ์งํ ์ ์๋ค. ์ ์ฝ์ ํ๋ก์ ํธ์ ๋ฃจํธ์ yarn.config.cjs
ํ์ผ์ ๋ง๋ค์ด ์ค์ ํ ์ ์๋ค. ๋ง์ฝ ๋ชจ๋ react ์์กด์ฑ์ 18.0.0์ผ๋ก ์ค์ ๋๋๋ก ๊ฐ์ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
module.exports = {
async constraints({Yarn}) {
for (const dep of Yarn.dependencies({ ident: 'react' })) {
dep.update(`18.0.0`);
}
},
};
PlugโnโPlay
Yarn PnP ํ๋ก์ ํธ์๋ node_modules
๋๋ ํ ๋ฆฌ๊ฐ ์๋ค. ๋์ pnp.cjs
์ด๋ผ๋ ๋ก๋ ํ์ผ์ด ์๋ค. ์ด ๋ก๋ ํ์ผ์๋ ํจํค์ง์ ์์น๋ฅผ ๋น๋กฏํ ํ๋ก์ ํธ์ ์์กด์ฑ ํธ๋ฆฌ์ ๊ดํ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด์๋ค.
/* react ํจํค์ง ์ค์์ */
["react", [
/* npm:18.2.0 ๋ฒ์ ์ */
["npm:18.2.0", {
/* ์ด ์์น์ ์๊ณ */
"packageLocation": "./.yarn/cache/react-npm-18.2.0-98658812fc-a76d86ec97.zip/node_modules/react/",
/* ์ด ์์กด์ฑ๋ค์ ์ฐธ์กฐํ๋ค. */
ย ย ย ย "packageDependencies": [
["loose-envify", "npm:1.4.0"]
],
}]
]],
Yarn PnP ํ๋ก์ ํธ์ ํจํค์ง๋ฅผ ์ค์นํ๋ yarn add
๋ช
๋ น์ ์คํํ๋ฉด ์ฒซ ๋ฒ์งธ๋ก ์์กด์ฑ์ ๋ฒ์ ์ ๊ณ ์ ํ๋ Resolution ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค. ์ด ๋จ๊ณ์์๋ ์ฐ์ package.json
ํ์ผ์ ๋ช
์๋ ์์กด์ฑ์ ๋ฒ์ ๋ฒ์์ ๋ฐ๋ผ ์ ํํ ๋ฒ์ ์ ๊ฒฐ์ ํ๋ค. ์ด์ด์ ์์กด์ฑ์ด ์์กดํ๋ ๋๋ค๋ฅธ ์์กด์ฑ์ ์ฐพ์๋ด๊ณ , ์ด๋ค์ ๋ฒ์ ์ญ์ ๊ณ ์ ํจ์ผ๋ก์จ ๋ชจ๋ ๋จธ์ ์์ ํญ์ ๊ณ ์ ๋ ๋ฒ์ ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค. ์ด ๊ฒฐ๊ณผ๋ yarn.lock
ํ์ผ์ ์ ์ฅ๋๋ค.
๋ ๋ฒ์งธ๋ Fetch ๋จ๊ณ๋ก, Resolution ๋จ๊ณ์์ ๊ฒฐ์ ๋ ๋ฒ์ ์ ์์กด์ฑ์ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ค์ด๋ก๋๋ฐ๋๋ค. ๋ง์ง๋ง์ Fetch ๋จ๊ณ์์ ๋ฐ์ ์์กด์ฑ์ ์์ค์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ Link ๋จ๊ณ๋ค. npm์ ๊ฒฝ์ฐ ๋จ์ํ ๋ชจ๋ ์์กด์ฑ์ node_modules
๋๋ ํ ๋ฆฌ ์๋์ ์ค์นํ๋ค. ๋ฐ๋ฉด Yarn PnP๋ ์์ ํ๋ฏ์ด, node_modules
๋๋ ํ ๋ฆฌ๋ฅผ ์ํํ์ง ์๊ณ โ์์กด์ฑ์ ์ด๋ค ํ์ผ์์ import
ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ฌด์์ import
ํ๋์งโ ์ถ์ ํ๋ค. ์ด๋ ๊ฒ ์ถ์ ํ ์ ๋ณด๋ ์์ ๊ฐ์ด .pnp.js
ํ์ผ์ ์ ์ฅํด๋๋ค.
Yarn PnP ํ๋ก์ ํธ๋ฅผ ์คํํ๋ฉด Node.js ํ๋ก์ธ์ค๋ .pnp.cjs
ํ์ผ์ ๋ฐํ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ Map ๊ฐ์ฒด(PnP Map)๋ฅผ ๋ง๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ถ ๋ก๋ํ๊ณ , import
์ require
๊ตฌ๋ฌธ์์ ์ด๋ฅผ ์ฐธ์กฐํ๋ค. npm์ด๋ pnpm๊ณผ ๊ฐ์ ํจํค์ง ๋งค๋์ ๋ค์ ๋๋ถ๋ถ์ ์๊ฐ์ ํ์ผ I/O์ ์๋ชจํ์ง๋ง, Yarn PnP๋ ์์กด์ฑ์ PnP Map์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํ์ผ I/O ์ฐ์ฐ์ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์๋ค. ๋ฐ๋ผ์ ์ผ๋จ ์ฒ์์ ๋ฉ๋ชจ๋ฆฌ์ PnP Map์ ๋ก๋ํ๊ณ ๋๋ฉด ์ดํ๋ก๋ node_modules
๋๋ ํ ๋ฆฌ๋ฅผ ์ํํ ํ์์์ด ๋ฉ๋ชจ๋ฆฌ์์ Map ์ฐ์ฐ๋ง ์ํํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๊ต์ฅํ ๋น ๋ฅด๋ค.
์ฐธ๊ณ ์๋ฃ
- ๋ฐ์์ง, โํจํค์ง ๋งค๋์ ์ ๊ณผ๊ฑฐ, ํ ์ค์ ์ ํ, ๊ทธ๋ฆฌ๊ณ ๋ฏธ๋โ, 2024
- Yarn Constraints
- Yarn PlugโnโPlay
- Yarn Workspaces
์ด ๋ฌธ์๋ฅผ ์ธ์ฉํ ๋ฌธ์
- ์ํํธ์จ์ด ๊ณตํ
- ECMAScript ๋ชจ๋
-
Yarn์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, v4.6.0 ์ด์.
-