Typescript: "์ค‘๊ฐ„ ๊ทœ๋ชจ" ํ”„๋กœ์ ํŠธ ์ง€์›

์— ๋งŒ๋“  2015๋…„ 06์›” 10์ผ  ยท  147์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

@nycdotnet ์„

์—ฌ๊ธฐ์—์„œ ์ œ์•ˆ์€ ๊ณต๋ฃก์ด ๋ถˆํƒ€๋Š” ์ง€๊ตฌ๋ฅผ ๊ฑธ์—ˆ๋˜ ์„ ์‚ฌ ์‹œ๋Œ€(์‹ฌ์ง€์–ด #11 ์ด์ „)์— ์ฒ˜์Œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์˜ ์–ด๋–ค ๊ฒƒ๋„ ์ฐธ์‹ ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ ์ž์ฒด๋กœ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Steve์˜ ์ œ์•ˆ์€ #3394์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ

ํ˜„์žฌ TypeScript์—์„œ๋Š” ์‹œ์ž‘ํ•˜๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ์‰ฝ๊ณ  ๋งค์ผ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(#2338 ๋ฐ System.js ์ž‘์—…์˜ ๋„์›€์œผ๋กœ). ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์•ฝ๊ฐ„์˜ ์žฅ์• ๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ: tsconfig.json์„ ์‚ฌ์šฉํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์†Œ์Šค๋ฅผ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ: ๋งž์ถคํ˜• ๋นŒ๋“œ ์‚ฌ์šฉ, ํ•„์š”ํ•œ ๊ณณ์— ์†Œ์Šค ๋ฐฐ์น˜

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

์Šคํ‹ฐ๋ธŒ๋Š” ์ธํ„ฐ๋ทฐ์—์„œ ์ด๊ฒƒ์ด ์„ธ์ƒ์˜ ์˜ฌ๋ฐ”๋ฅธ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์ง€์ ํ–ˆ๊ณ  ๋‚˜๋Š” ๊ทธ์— ๋™์˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์„ธ ๊ฐ€์ง€ ํฌ๊ธฐ์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ: tsconfig.json์„ ์‚ฌ์šฉํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์†Œ์Šค๋ฅผ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘๊ฐ„ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ: ํ‘œ์ค€ ๋นŒ๋“œ ๋ฐ ๊ณต์œ  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ
  • ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ: ์‚ฌ์šฉ์ž ์ •์˜ ๋นŒ๋“œ ์‚ฌ์šฉ, ํ•„์š”ํ•œ ๊ณณ์— ์†Œ์Šค ๋ฐฐ์น˜

Steve๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๋ฅผ ํ™•์žฅํ•  ๋•Œ ์ค‘๊ฐ„ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋„๊ตฌ ์ง€์›์ด ๋„ˆ๋ฌด ๋นจ๋ฆฌ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด "์ค‘๊ฐ„ ๊ทœ๋ชจ" ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ์—๋Š” ํ˜„์žฌ tsconfig.json์—์„œ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ๋นŒ๋“œ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ํ”„๋กœ์ ํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋นŒ๋“œ๋œ๋‹ค๋Š” ์ ์€ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ฐ€์„ค์€ ์ด ์ˆ˜์ค€์—์„œ ์ด ์ง€์›์œผ๋กœ ์ž˜ ์ œ๊ณต๋  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ๋‹นํžˆ ๋งŽ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชฉํ‘œ

๋ช…๋ น์ค„ ์ปดํŒŒ์ผ๊ณผ IDE์—์„œ ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋กœ ์ž‘์—…ํ•  ๋•Œ "์ค‘๊ฐ„ ํฌ๊ธฐ" ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋น„๋ชฉํ‘œ

์ด ์ œ์•ˆ์€ ์„ ํƒ์  ์ปดํŒŒ์ผ์ด๋‚˜ ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ์ด์™ธ์˜ ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•˜์ง€ _์•Š์Šต๋‹ˆ๋‹ค_. ์ด ์ œ์•ˆ์€ ๋˜ํ•œ ๋ณ„๋„์˜ ์ œ์•ˆ์—์„œ ์ฒ˜๋ฆฌ๋  ๋ฒˆ๋“ค๋ง ๋˜๋Š” ํŒจํ‚ค์ง•์„ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์š”์ปจ๋Œ€, ์ด๋ฆ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด ์ œ์•ˆ์€ '์ค‘๊ฐ„ ๊ทœ๋ชจ' ํ”„๋กœ์ ํŠธ๋งŒ ๋‹ค๋ฃจ๊ณ  ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ค๊ณ„

์ค‘๊ฐ„ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ tsconfig.json์ด ๋‹ค๋ฅธ ๊ฒƒ์„ ์ฐธ์กฐํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

์˜ค๋Š˜์˜ tsconfig.json ์˜ˆ:

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true
    },
    "files": [
        "core.ts",
        "sys.ts"
    ]
}

์ œ์•ˆ๋œ tsconfig.json '์ข…์†์„ฑ' ์„น์…˜:

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true
    },
    "dependencies": [
        "../common", 
        "../util"
    ],
    "files": [
        "core.ts",
        "sys.ts"
    ]
}

์ข…์†์„ฑ์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

  • tsconfig.json์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ
  • tsconfig.json ์ง์ ‘

์ข…์†์„ฑ์€ ๊ณ„์ธต์ ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•˜๋ ค๋ฉด ๋ฃจํŠธ tsconfig.json์ด ํฌํ•จ๋œ ์˜ฌ๋ฐ”๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ข…์†์„ฑ์ด ์ˆœํ™˜๋  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ฆ‰ ์ˆœํ™˜ ์ข…์†์„ฑ์ด ์žˆ๋Š” ์œ ํ˜•์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ „์ฒด ํ•ด๊ฒฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹

์ข…์†์„ฑ์€ '์ข…์†์„ฑ' ์„น์…˜์— ๋‚˜์—ด๋œ ์ˆœ์„œ๋Œ€๋กœ ๋จผ์ € ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ข…์†์„ฑ ๋นŒ๋“œ์— ์‹คํŒจํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์ข…๋ฃŒ๋˜๊ณ  ํ”„๋กœ์ ํŠธ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ๊ณ„์† ๋นŒ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ ์ข…์†์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด ์ถœ๋ ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” '.d.ts' ํŒŒ์ผ์„ ํ˜„์žฌ ๋นŒ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…์†์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

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

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

์ œํ•œ ์‚ฌํ•ญ

tsconfig.json์ด ์—†๋Š” ์ข…์†์„ฑ์œผ๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜ค๋ฅ˜๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์ข…์†์„ฑ์˜ ์ถœ๋ ฅ์€ ์ž์ฒด ํฌํ•จ๋˜๊ณ  ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์™€ ๋ณ„๊ฐœ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ข…์†์„ฑ์˜ ์ถœ๋ ฅ .js๋ฅผ tsconfig.json์„ ํ†ตํ•ด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์™ธ๋ถ€ ๋„๊ตฌ๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ˆœํ™˜ ์ข…์†์„ฑ์€ ์˜ค๋ฅ˜๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ:

A - B
\ ์”จ

A๋Š” 'ํ˜„์žฌ ํ”„๋กœ์ ํŠธ'์ด๋ฉฐ B์™€ C์˜ ๋‘ ๊ฐ€์ง€ ์ข…์†์„ฑ์— ์ข…์†๋ฉ๋‹ˆ๋‹ค. B์™€ C ์ž์ฒด์— ์ข…์†์„ฑ์ด ์—†์œผ๋ฉด ์ด ๊ฒฝ์šฐ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. C๊ฐ€ B์— ์ข…์†๋œ ๊ฒฝ์šฐ B๋Š” C์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆœํ™˜์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ B๊ฐ€ A์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Š” ์ˆœํ™˜์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์—์„œ B๊ฐ€ C์— ์ข…์†๋˜๊ณ  C๊ฐ€ ์ž์ฒด ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ด๋Š” ์ฃผ๊ธฐ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์ˆœ์„œ๋Š” ///ref์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” C, B, A๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์„ ํƒ์  ์ตœ์ ํ™”/๊ฐœ์„  ์‚ฌํ•ญ

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

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

Committed Monorepos & Cross-Project References Suggestion

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

์•„๋ž˜์—์„œ ๋ฌธ์„œ/๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ์ž‘์—… ์ง„ํ–‰ ์ค‘(ํ”ผ๋“œ๋ฐฑ์— ๋”ฐ๋ผ ์ˆ˜์ • ์˜ˆ์ •)

์ด ์Šค๋ ˆ๋“œ๋ฅผ ํŒ”๋กœ์šฐํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ์‹œ๋„ํ•ด ๋ณผ ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ํ˜„์žฌ ๋ชจ๋…ธ๋ ˆํฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋งˆ์ง€๋ง‰ ๋ฒ„๊ทธ/๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ณง ์ด์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋Š” TypeScript ํ”„๋กœ๊ทธ๋žจ์„ ๋” ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” TypeScript 3.0์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

๋˜ํ•œ ๋” ๋น ๋ฅธ TypeScript ๋นŒ๋“œ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” tsc , --build ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ชจ๋“œ๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ํ”„๋กœ์ ํŠธ

์ƒ๋‹นํžˆ ์ •์ƒ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ดํŽด๋ณด๊ณ  ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๋” ์ž˜ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€ ๋ด…์‹œ๋‹ค.
converter ๋ฐ units ๋‘ ๊ฐœ์˜ ๋ชจ๋“ˆ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์™€ ๊ฐ๊ฐ์— ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

/src/converter.ts
/src/units.ts
/test/converter-tests.ts
/test/units-tests.ts
/tsconfig.json

ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ ๊ตฌํ˜„ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

// converter-tests.ts
import * as converter from "../converter";

assert.areEqual(converter.celsiusToFahrenheit(0), 32);

์ด์ „์—๋Š” ๋‹จ์ผ tsconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ์–ด์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์—ฌ๋Ÿฌ tsconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€ ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

  • ๋‚ด์žฅ๋œ ์ตœ์‹  ํ™•์ธ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ ๊ฒฐ๊ตญ tsc ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • tsc ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ๋” ๋งŽ์€ ์‹œ์ž‘ ์‹œ๊ฐ„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • tsc -w ๋Š” ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฌธ์ œ ๋“ฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

tsconfig.json ํŒŒ์ผ์—๋Š” ์ƒˆ๋กœ์šด ์ตœ์ƒ์œ„ ์†์„ฑ references ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐํ•  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

{
    "compilerOptions": {
        // The usual
    },
    "references": [
        { "path": "../src" }
    ]
}

๊ฐ ์ฐธ์กฐ์˜ path ์†์„ฑ์€ tsconfig.json ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ ์ž์ฒด(์ด๋ฆ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ)๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋Œ€์‹  ์ถœ๋ ฅ ์„ ์–ธ ํŒŒ์ผ( .d.ts )์ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
  • ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ๊ฐ€ outFile ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ถœ๋ ฅ ํŒŒ์ผ .d.ts ํŒŒ์ผ์˜ ์„ ์–ธ์ด ์ด ํ”„๋กœ์ ํŠธ์—์„œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ๋นŒ๋“œ ๋ชจ๋“œ(์•„๋ž˜ ์ฐธ์กฐ)๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

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

composite

์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์—๋Š” ์ƒˆ composite ์„ค์ •์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ์„ค์ •์€ TypeScript๊ฐ€ ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์„ ์ฐพ์„ ์œ„์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
composite ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

  • rootDir ์„ค์ •์€ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ tsconfig ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ตฌํ˜„ ํŒŒ์ผ์€ include ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๊ฑฐ๋‚˜ files ๋ฐฐ์—ด์— ๋‚˜์—ด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜๋ฉด tsc ์ง€์ •๋˜์ง€ ์•Š์€ ํŒŒ์ผ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • declaration ๊ฐ€ ์ผœ์ ธ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

declarationMaps

์„ ์–ธ ์†Œ์Šค ๋งต์— ๋Œ€ํ•œ ์ง€์›๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
--declarationMap ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด "์ •์˜๋กœ ์ด๋™" ๋ฐ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ์™€ ๊ฐ™์€ ํŽธ์ง‘๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์›๋˜๋Š” ํŽธ์ง‘๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ์ฝ”๋“œ๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ํƒ์ƒ‰ํ•˜๊ณ  ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

prepend outFile

์ฐธ์กฐ์—์„œ prepend ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ์˜ ์ถœ๋ ฅ์„ ์•ž์— ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

   "references": [
       { "path": "../utils", "prepend": true }
   ]

ํ”„๋กœ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ ์œ„์— ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ .js ํŒŒ์ผ๊ณผ .d.ts ํŒŒ์ผ ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ์†Œ์Šค ๋งต ํŒŒ์ผ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.

tsc ๋Š” ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋””์Šคํฌ์˜ ๊ธฐ์กด ํŒŒ์ผ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์ด ๊ฒฐ๊ณผ ํŒŒ์ผ์— ๋‘ ๋ฒˆ ์ด์ƒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅธ ์ถœ๋ ฅ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .
์˜ˆ๋ฅผ ๋“ค์–ด:

  ^ ^ 
 /   \
B     C
 ^   ^
  \ /
   D

์ด ์ƒํ™ฉ์—์„œ๋Š” D ์˜ ์ถœ๋ ฅ์— A ์˜ ๋‘ ๋ณต์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๊ฐ ์ฐธ์กฐ ์•ž์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์— ๋Œ€ํ•œ ์ฃผ์˜ ์‚ฌํ•ญ

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์—๋Š” ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ ˆ์ถฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ข…์† ํ”„๋กœ์ ํŠธ๋Š” ์ข…์†์„ฑ์—์„œ ๋นŒ๋“œ๋œ .d.ts ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ๋นŒ๋“œ ์ถœ๋ ฅ์„ ์ฒดํฌ์ธ ํ•˜๊ฑฐ๋‚˜ ๋ณต์ œํ•œ ํ›„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ด์•ผ ๊ฐ€์งœ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ํŽธ์ง‘๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜.
์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” .d.ts ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค ๋’ค์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ณต์ œ ํ›„ ๋นŒ๋“œํ•ด์•ผ ํ•จ์„ ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ์กด ๋นŒ๋“œ ์›Œํฌํ”Œ๋กœ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด --build ์Šค์œ„์น˜๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ํ•œ tsc ๋Š” ์ข…์†์„ฑ์„ ์ž๋™์œผ๋กœ ๋นŒ๋“œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .
--build ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

TypeScript์šฉ ๋นŒ๋“œ ๋ชจ๋“œ

์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์˜จ ๊ธฐ๋Šฅ์€ TypeScript ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์Šค๋งˆํŠธ ์ฆ๋ถ„ ๋นŒ๋“œ์ž…๋‹ˆ๋‹ค.
3.0์—์„œ๋Š” tsc ์™€ ํ•จ๊ป˜ --build ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‹จ์ˆœํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋ณด๋‹ค ๋นŒ๋“œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” tsc ์˜ ์ƒˆ๋กœ์šด ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค.

tsc --build (์ค„์—ฌ์„œ tsc -b )๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • ์ฐธ์กฐ๋œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ์ฐพ๊ธฐ
  • ์ตœ์‹  ์ƒํƒœ์ธ์ง€ ๊ฐ์ง€
  • ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์˜ค๋ž˜๋œ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ

tsc -b ์— ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: tsc -b src test ).
๊ทธ๋ƒฅ ๊ฐ™์€ tsc -p ์ด ์ด๋ฆ„ ์•Š๋‹ค๋ฉด ์ž์ฒด๊ฐ€ ๋ถˆํ•„์š” ์„ค์ • ํŒŒ์ผ ์ด๋ฆ„ ์ง€์ •, tsconfig.json .

tsc -b ๋ช…๋ น์ค„

์›ํ•˜๋Š” ์ˆ˜์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 > tsc -b                                # Build the tsconfig.json in the current directory
 > tsc -b src                            # Build src/tsconfig.json
 > tsc -b foo/release.tsconfig.json bar  # Build foo/release.tsconfig.json and bar/tsconfig.json

๋ช…๋ น์ค„์—์„œ ์ „๋‹ฌํ•˜๋Š” ํŒŒ์ผ ์ˆœ์„œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. tsc ๋Š” ์ข…์†์„ฑ์ด ํ•ญ์ƒ ๋จผ์ € ๋นŒ๋“œ๋˜๋„๋ก ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํŒŒ์ผ์„ ์žฌ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

tsc -b ๊ด€๋ จ ํ”Œ๋ž˜๊ทธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • --verbose : ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ž์„ธํ•œ ๋กœ๊น…์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ์™€ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ์Œ)
  • --dry : ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ํ‘œ์‹œํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋นŒ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • --clean : ์ง€์ •๋œ ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค( --dry ์™€ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ).
  • --force : ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™
  • --watch : ๊ฐ์‹œ ๋ชจ๋“œ( --verbose ์ œ์™ธํ•œ ํ”Œ๋ž˜๊ทธ์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์—†์Œ)

์ฃผ์˜ ์‚ฌํ•ญ

๋ณดํ†ต tsc ์ถœ๋ ฅ (์ƒ์‚ฐํ•  ์˜ˆ์ • .js ๋ฐ .d.ts ์•Š๋Š”) ๊ตฌ๋ฌธ ๋˜๋Š” ์ž…๋ ฅ ์—๋Ÿฌ์˜ ์กด์žฌ๋ฅผ noEmitOnError ์—์žˆ๋‹ค.
์ฆ๋ถ„ ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋‚˜์ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜์— ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ›„์† ๋นŒ๋“œ๊ฐ€ ํ˜„์žฌ ์ตœ์‹  ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ด์œ ๋กœ tsc -b noEmitOnError ๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด

๋นŒ๋“œ ์ถœ๋ ฅ( .js , .d.ts , .d.ts.map ๋“ฑ)์„ ์ฒดํฌ์ธํ•˜๋Š” ๊ฒฝ์šฐ ํŠน์ • ์†Œ์Šค ์ œ์–ด ํ›„์— --force ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ œ์–ด ๋„๊ตฌ๊ฐ€ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ๊ณผ ์›๊ฒฉ ๋ณต์‚ฌ๋ณธ ์‚ฌ์ด์˜ ํƒ€์ž„์ŠคํŠธ๋งต์„ ์œ ์ง€ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ž‘์—…์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

msbuild

msbuild ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋นŒ๋“œ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    <TypeScriptBuildMode>true</TypeScriptBuildMode>

๋‹น์‹ ์˜ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์—. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž๋™ ์ฆ๋ถ„ ๋นŒ๋“œ ๋ฐ ์ •๋ฆฌ๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

tsconfig.json / -p ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ์กด TypeScript ํ”„๋กœ์ ํŠธ ์†์„ฑ์€ ์กด์ค‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ค์ •์€ tsconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ํŒ€์€ tsconfig ํŒŒ์ผ์ด ์ง์„ ์ด๋ฃจ๋Š” ๊ด€๋ฆฌ๋˜๋Š” ํ”„๋กœ์ ํŠธ์™€ ๋™์ผํ•œ ์•”์‹œ์  ๊ทธ๋ž˜ํ”„ ์ˆœ์„œ๋ฅผ ๊ฐ–๋Š” msbuild ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
์†”๋ฃจ์…˜์ด ์ด์™€ ๊ฐ™์œผ๋ฉด ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์™€ ํ•จ๊ป˜ tsc -p ์™€ ํ•จ๊ป˜ msbuild ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์™„์ „ํžˆ ์ƒํ˜ธ ์šด์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋‚ด

์ „์ฒด ๊ตฌ์กฐ

tsconfig.json ํŒŒ์ผ์ด ๋” ๋งŽ์œผ๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ ์ƒ์† ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•  ํ•„์š” ์—†์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๋ฆฌํ”„ ๋…ธ๋“œ ํ”„๋กœ์ ํŠธ์— references ๊ฐ€ ์žˆ๋Š” "์†”๋ฃจ์…˜" tsconfig.json ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ์ง„์ž…์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด TypeScript ์ €์žฅ์†Œ์—์„œ src/tsconfig.json ์— ๋ชจ๋“  ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‚˜์—ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด tsc -b src ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
3.0๋ถ€ํ„ฐ๋Š” tsconfig.json ํŒŒ์ผ์— reference ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ files ๋ฐฐ์—ด์ด ๋น„์–ด ์žˆ๋Š” ๊ฒƒ์ด ๋” ์ด์ƒ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

TypeScript ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. src/tsconfig_base.json , src/tsconfig.json ๋ฐ src/tsc/tsconfig.json ๋ฅผ ์ฃผ์š” ์˜ˆ๋กœ ์ฐธ์กฐํ•˜์„ธ์š”.

์ƒ๋Œ€ ๋ชจ๋“ˆ์„ ์œ„ํ•œ ๊ตฌ์กฐํ™”

์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๋Œ€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ repo๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ฃผ์–ด์ง„ ์ƒ์œ„ ํด๋”์˜ ๊ฐ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— tsconfig.json ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์— reference ์ถ”๊ฐ€ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋„๋œ ๊ณ„์ธต๊ณผ ์ผ์น˜์‹œํ‚ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
outDir ๋ฅผ ์ถœ๋ ฅ ํด๋”์˜ ๋ช…์‹œ์  ํ•˜์œ„ ํด๋”๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ rootDir ๋ฅผ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ํด๋”์˜ ๊ณตํ†ต ๋ฃจํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

outFile์„ ์œ„ํ•œ ๊ตฌ์กฐํ™”

outFile ์‚ฌ์šฉํ•œ ์ปดํŒŒ์ผ ๋ ˆ์ด์•„์›ƒ์€ ์ƒ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.
๋ช…์‹ฌํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "๋งˆ์ง€๋ง‰" ํ”„๋กœ์ ํŠธ๊นŒ์ง€ prepend ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ํ–ฅ์ƒ๋˜๊ณ  ์ฃผ์–ด์ง„ ๋นŒ๋“œ์— ํ•„์š”ํ•œ I/O ์–‘์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
TypeScript ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ž์ฒด๋Š” ์—ฌ๊ธฐ์—์„œ ์ข‹์€ ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ" ํ”„๋กœ์ ํŠธ์™€ ์ผ๋ถ€ "์ข…์ " ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "์—”๋“œํฌ์ธํŠธ" ํ”„๋กœ์ ํŠธ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘๊ฒŒ ์œ ์ง€๋˜๊ณ  ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์œ„ํ•œ ๊ตฌ์กฐํ™”

TODO: ๋” ๋งŽ์ด ์‹คํ—˜ํ•˜๊ณ  ์ด๊ฒƒ์„ ์•Œ์•„๋‚ด์‹ญ์‹œ์˜ค. Rush์™€ Lerna๋Š” ์šฐ๋ฆฌ ์ชฝ์—์„œ ๋‹ค๋ฅธ ๊ฒƒ์„ ์•”์‹œํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋ง™์†Œ์‚ฌ!

:+1:

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

ํ™์˜ฅ,

์นœ์ ˆํ•œ ํ”ผ๋“œ๋ฐฑ์„ ํ•ด์ฃผ์‹œ๊ณ  ๊ฒฐ์ •ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. TypeScript๋Š” ๋งค์šฐ ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ด๋ฉฐ ์ด ๊ธฐ๋Šฅ์€ ์—„๊ฒฉํ•œ ๊ด€์‹ฌ ๋ถ„ํ• ์— ์˜์กดํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ(์˜ˆ: Azure Portal ๋˜๋Š” ํ”„๋กœ์ ํŠธ Monacos์˜ > 100kloc ๋ฐ ๋งŽ์€ ๋…๋ฆฝ ํŒ€์ด ์žˆ๋Š” ์„ธ๊ณ„). ์ฆ‰, ์ด๊ฒƒ์€ "์ผ๋ฐ˜์ธ"์—๊ฒŒ ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ @NoelAbrahams (#2180)์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ์ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ œ์•ˆ

๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์ด ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ด์ œ ๋งˆ๊ฐํ•œ ๋‚ด ์ œ์•ˆ(#3394)๊ณผ ๋น„๊ตํ•˜์—ฌ ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋‹จ์ ์€ ์ฐธ์กฐ์— ๋Œ€ํ•œ ๋Œ€์ฒด ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ž์„ธํžˆ ์„ค๋ช…๋œ ๋‹ค์Œ ์‹ค์ œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. https://github.com/Microsoft/TypeScript/issues/3394#issuecomment -109359701

๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ csproj2ts์— ์˜์กดํ•˜๋Š” TypeScript ํ”„๋กœ์ ํŠธ grunt-ts๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. grunt-ts์—์„œ ์ž‘์—…ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ๊ธฐ๋Šฅ ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ์ œํ•œ์ ์ด๋ฏ€๋กœ csproj2ts์—์„œ ์ž‘์—…ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๋‘ ํ”„๋กœ์ ํŠธ๋ฅผ ๋™์‹œ์— ์ž‘์—…ํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง/์ •์˜๋กœ ์ด๋™/๋ชจ๋“  ์ฐธ์กฐ ์ฐพ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์„ ํ•  ๋•Œ ์ข…์†์„ฑ ๊ฐœ์ฒด๊ฐ€ ๋ช…๋ช…๋œ ํด๋ฐฑ์ด ์žˆ๋Š” ๊ฐœ์ฒด ๋ฆฌํ„ฐ๋Ÿด์ด ๋˜๋„๋ก ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ๋” ๋ถ€ํ•ฉํ•˜๋Š” ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"dependencies": {
   "csproj2ts": ["../csproj2ts","node_modules/csproj2ts/csproj2ts.d.ts"],
   "SomeRequiredLibrary": "../SomeRequiredLibraryWithNoFallback"
}

์—ฌ์ „ํžˆ ๋ฐฐ์—ด์ด ๋˜๋„๋ก ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด grunt-ts tsconfig.json ํŒŒ์ผ์˜ ๋ฏธ๋ž˜ ๊ฐ€์ƒ dependencies ์„น์…˜์˜ ๋‹ค์Œ ๋Œ€์ฒด ๊ตฌํ˜„์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

"dependencies": [
   ["../csproj2ts","node_modules/csproj2ts/csproj2ts.d.ts"],
   "../SomeRequiredLibraryWithNoFallback"
]

dependencies ๊ฐ ๋ฐฐ์—ด ์œ ํ˜• ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์—์„œ ๋ฐœ๊ฒฌ๋œ _first_ ํ•ญ๋ชฉ์ด ์‚ฌ์šฉ๋˜๋Š” ํ•ญ๋ชฉ์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์œ ํ˜• ํ•ญ๋ชฉ์€ Jonathan์˜ ์ œ์•ˆ์„œ์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ๋” ๋ณต์žกํ•œ ์†”๋ฃจ์…˜์ด์ง€๋งŒ ๊ฐœ๋ฐœ์ž(๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž)์—๊ฒŒ ํ›จ์”ฌ ๋” ํฐ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. csproj2ts์—์„œ ๊ฐœ๋ฐœํ•  ํ•„์š”๊ฐ€ ์—†๋Š”(๋”ฐ๋ผ์„œ ../csproj2ts/tsconfig.json ํŒŒ์ผ์ด ์—†๋Š”) ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝ์šฐ ์ข…์†์„ฑ์€ ์ปดํŒŒ์ผ ์ปจํ…์ŠคํŠธ์— ์ถ”๊ฐ€๋˜๋Š” ์ •์˜ ํŒŒ์ผ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ../csproj2ts/tsconfig.json ํŒŒ์ผ์ด ์žˆ๋Š” _do_ ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝ์šฐ ์ œ์•ˆ์„œ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ์—์„œ "../SomeRequiredLibraryWithNoFallback" ๋Š” ๊ธฐ์กด ์ œ์•ˆ์—์„œ์™€ ๊ฐ™์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์—†๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ ์žˆ๊ณ  ์–ธ์–ด ์„œ๋น„์Šค ์ง€์›์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Build์˜ ๊ฒฝ์šฐ tsconfig๊ฐ€ ์—ฌ๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋นŒ๋“œ ์‹œ์Šคํ…œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ๊ณผ ํ•จ๊ป˜ typescript ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์˜์กด์„ฑ ํŒŒ์•…
  • ์ฃผ์žฅ์— ๋Œ€ํ•œ ์ตœ์‹  ํ™•์ธ
  • ๊ตฌ์„ฑ ๊ด€๋ฆฌ(๋ฆด๋ฆฌ์Šค ๋Œ€ ๋””๋ฒ„๊ทธ)

์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋นŒ๋“œ ์‹œ์Šคํ…œ์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋ ค์šด ๋ฌธ์ œ์ด๋ฉฐ MSBuild, grunt, gulp ๋“ฑ๊ณผ ๊ฐ™์ด ์ด๋ฏธ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
tsconfig ๋ฐ tsc๊ฐ€ ๋นŒ๋“œ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋˜๋ฉด ๋ชจ๋“  CPU๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ จ ์—†๋Š” ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ ๊ฐ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์‚ฌํ›„ ๋ฐ ์‚ฌ์ „ ๋นŒ๋“œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ทธ๋“ค์ด ํ•˜๋Š” ์ผ์„ ์ž˜ํ•˜๋Š” ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ์žˆ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ธ์–ด ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ,
๋„๊ตฌ๊ฐ€ ์—ฌ๋Ÿฌ tsconfig ํŒŒ์ผ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์ถ”๋ก ํ•˜๊ณ  ๋” ๋งŽ์€ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋นŒ๋“œ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค :

"files" : [
    "file1.ts",
    {
        "path": "../projectB/out/projectB.d.ts",
         "sourceProject": "../projectB/"
     }
]

์—ฌ๊ธฐ์„œ tsc๋Š” "๊ฒฝ๋กœ"๋งŒ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋„๊ตฌ๋Š” ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ๋ณด๊ณ  ์ตœ๋Œ€ํ•œ ๋„์›€์ด ๋˜๋„๋ก ๋…ธ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฌธ์ œ์˜ ์กด์žฌ๋ฅผ ์ธ์ •ํ•˜์ง€๋งŒ ์ผ๊ด„ ๋นŒ๋“œ ๋ฐ ํˆด๋ง์ด ์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. tsconfig.json์€ ๊ตฌ์„ฑ ๋ฐฑ(์ฆ‰, ์‘๋‹ต ํŒŒ์ผ์— ๋Œ€ํ•œ json ๋Œ€์•ˆ)์œผ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ tsconfig.json์€ ๋‹จ์ผ tsc ํ˜ธ์ถœ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. tsc๋Š” ๋‹จ์ผ ํ”„๋กœ์ ํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

VS์˜ MSBuild ํ”„๋กœ์ ํŠธ๋Š” ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ IDE ๊ธฐ๋Šฅ์„ ๋นŒ๋“œํ•˜๋Š” ์˜ˆ์ด๋ฉฐ ์ด์ œ ppl์€ ๋„ˆ๋ฌด ์ปค์„œ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๋ชจํ•˜๋ฉ”๋“œ. ๋‚ด๊ฐ€ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ์กฐ์ •ํ•˜๋Š” ์ž‘์—…์€ ์ „์šฉ ๋นŒ๋“œ ๋„๊ตฌ์˜ ์˜์—ญ์œผ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • TypeScript ์–ธ์–ด ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ด ์ œ์•ˆ์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ด tsconfig.json ์—์„œ tsc --project ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ tsc file1.ts ../project/out/project.d.ts ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TypeScript ์–ธ์–ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ VS ๋˜๋Š” ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ์—์„œ ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด๋ฉด "์ •์˜๋กœ ์ด๋™"์ด ๊ฐœ๋ฐœ์ž๋ฅผ ๊ธฐ๋Šฅ์ด ์ •์˜๋œ _์‹ค์ œ TypeScript ํŒŒ์ผ_์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( projectB.d.ts ์˜ ์ •์˜๊ฐ€ ์•„๋‹˜).

๋‚˜์—๊ฒŒ ๊ทธ๋Ÿฐ ๊ถŒ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋งค์šฐ ๊ณต์ •ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์›๋ž˜ ์ œ์•ˆ(https://github.com/Microsoft/TypeScript/issues/3394)์—์„œ ๋‚ด ์•„์ด๋””์–ด๊ฐ€ ์ถœ๋ ฅ๋  ์œ„์น˜์—์„œ ๋ฐฉ์ถœ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์•„์ด๋””์–ด๊ฐ€ ๋ถˆ์™„์ „ํ•˜๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋Ÿฐํƒ€์ž„ ์‹œ ์ฐธ์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ์œ„์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. "์ •๋ง ํ•„์š”ํ•œ ๊ฒƒ์€ ์–ธ์–ด ์„œ๋น„์Šค ์ง€์›์ธ๋ฐ ์™œ ์ค‘๊ฐ„์— ๊ฑด๋ฌผ์„ ์ง“๋Š๋ƒ"๊ณ  ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

"files" : [
    "file1.ts",
    {
        "path": "externalLibraries/projectB.d.ts",
         "sourceProject": "../projectB/"
     }
]

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” projectB์— ๋Œ€ํ•œ ์ •์˜์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€๋งŒ projectB์— ๋Œ€ํ•œ ์‹ค์ œ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‹ค์ œ ์†Œ์Šค๊ฐ€ ๋Œ€์‹  ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

์ž˜ ๋“ค๋ฆฐ๋‹ค!

๋‚˜๋Š” @mhegazy์— ๋™์˜ํ•˜๊ณ  ์‹ค์ œ๋กœ TypeScript๊ฐ€ ์Šค์Šค๋กœ๋ฅผ '์ปดํŒŒ์ผ๋Ÿฌ'๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ๋ฉˆ์ถ”๊ณ  ์Šค์Šค๋กœ๋ฅผ '์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ' ๋ฐ 'ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ'๋กœ ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋‹จ์ผ ํŒŒ์ผ ๋ณ€ํ™˜ ์ง€์›์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„/๋ฒˆ๋“ค๋ง์„ ์ œ์™ธํ•˜๊ณ  ์ปดํŒŒ์ผ๋œ JavaScript ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹ค์ œ typescript ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์œ ํ˜• ๊ฒ€์‚ฌ ์ค‘์— ์™ธ๋ถ€ ์ฐธ์กฐ ์ •์˜๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋ฐ ํŒจํ‚ค์ง€ ํ•ด์„์€ ์‚ฌ์šฉ ์ค‘์ธ ๋นŒ๋“œ ์‹œ์Šคํ…œ(browserify, systemjs, webpack ๋“ฑ)์˜ ์ฑ…์ž„์ด๋ฏ€๋กœ ์–ธ์–ด โ€‹โ€‹์„œ๋น„์Šค๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋นŒ๋“œ ์‹œ์Šคํ…œ/ํ”Œ๋žซํผ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ์„ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ๋นŒ๋“œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • LanguageServicesHost๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ tsconfig.json์— ์˜ฌ๋ฐ”๋ฅธ ๋งคํ•‘ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜๋Š” ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

@nycdotnet ์—ฌ๋Ÿฌ ๋Œ€์ฒด ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ npm link ../csproj2ts ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ž˜ ์ฒ˜๋ฆฌ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ/ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ์™€ ๋ณ„๋„๋กœ ๋นŒ๋“œ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋Š” @mhegazy์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์„น์…˜์— *.ts ํŒŒ์ผ์ด ๋‚˜์—ด๋˜์ง€ ์•Š์œผ๋ฉด ์—ฌ์ „ํžˆ ํŒŒ์ผ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— tsconfig -> tsconfig ์ข…์†์„ฑ์„ ํŒŒ์ผ ์„น์…˜์— ํฌํ•จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ˆ

"ํŒŒ์ผ": [
{
"๊ฒฝ๋กœ": "externalLibraries/projectB.d.ts",
"sourceProject": "../projectB/"
}
]

tsconfig.json ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ts ํŒŒ์ผ์€ ๊ณ„์† ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

@dbaeumer ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ์†์„ฑ์— ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ํŒŒ์ผ์ด ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด ํ•ญ์ƒ ์‚ฌ์šฉ๋˜๋ฉฐ include *.ts ๋ถ€๋ถ„์€ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

@mhegazy ๋ฐ˜๋“œ์‹œ ๋‹ค๋ฅธ ์„น์…˜์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฒฐ๊ตญ์—๋Š” ์ƒํ™ฉ์ด ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ”ผํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ tsconfig -> tsconfig ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ํŒŒ์ผ์„ ๊ฐ•์ œ๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด *.ts ํŒŒ์ผ์„ ๋‚˜์—ดํ•˜์ง€ ์•Š๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

์œ„์˜ ์ œ์•ˆ์—์„œ(.d.ts์™€ ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ์ฐธ์กฐ๋˜๋Š” ๊ฒฝ์šฐ) .d.ts๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒƒ์ธ์ง€(์ฆ‰, ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•˜๋Š”์ง€) ๊ฐ์ง€ํ•ฉ๋‹ˆ๊นŒ? Refactor/Rename๊ณผ ๊ฐ™์€ ์ž‘์—…์€ ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ(์ฆ‰, ๋‹ค์Œ ๋นŒ๋“œ๋ฅผ ๋ฎ์–ด์“ฐ๊ฒŒ ๋  .d.ts ํŒŒ์ผ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ ์†Œ์Šค์˜ ์ด๋ฆ„์„ ์—…๋ฐ์ดํŠธํ•จ)? GoToDef๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์˜ ์›๋ณธ ์ฝ”๋“œ(์ „์ฒด ํ”„๋กœ์ ํŠธ์˜ ๊ฑฐ๋Œ€ํ•œ .d.ts ํŒŒ์ผ ์ค‘๊ฐ„์ด ์•„๋‹˜)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๊นŒ? ์ด๋Š” ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ถ„์„ํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์— .d.ts๊ฐ€ ์œ ์šฉํ•œ๊ฐ€์š”?

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

๋ฌธ์ œ๋Š” ํŽธ์ง‘ ์‹œ๋‚˜๋ฆฌ์˜ค๋‹ค. ํŽธ์ง‘ํ•˜๋Š” ๋™์•ˆ ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์€ ์ƒ์„ฑ๋œ .d.ts์˜ ์ถœ์ฒ˜์— ๋Œ€ํ•œ "ํžŒํŠธ"๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ธ์–ด ์„œ๋น„์Šค๋Š” .d.ts๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ํžŒํŠธ ๊ฒฝ๋กœ์—์„œ "ํ”„๋กœ์ ํŠธ"๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ goto def๋Š” .d.ts ๋Œ€์‹  ๊ตฌํ˜„ ํŒŒ์ผ๋กœ ์ด๋™ํ•˜๋ฉฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปดํŒŒ์ผ ์—†์ด๋„ ์˜ค๋ฅ˜๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ์™€ ๊ฐ™์€ ์ž‘์—…์€ ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ "์ „ํŒŒ"ํ•˜๊ณ  ์œ ์‚ฌํ•˜๊ฒŒ ์ฐธ์กฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚ ์—๋Š” TS๊ฐ€ ํŒŒ์ผ์„ ์ฝ๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ tsconfig.json ํŒŒ์ผ์„ ์ฐพ๋Š” ๊ฒƒ์€ ์ „์ ์œผ๋กœ ํ˜ธ์ŠคํŠธ(IDE ๋“ฑ)์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์ธต์  ๋ฐฉ์‹์œผ๋กœ ์—ฌ๋Ÿฌ tsconfig.json์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜ธ์ŠคํŠธ๋Š” ์—ฌ์ „ํžˆ ์ดˆ๊ธฐ ํŒŒ์ผ์„ ํ•ด์„ํ•  ์ฑ…์ž„์ด ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ํŒŒ์ผ์€ ํ•ด์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ˜ธ์ŠคํŠธ๊ฐ€ ๋ชจ๋“  tsconfig๋ฅผ ํ•ด์„ํ•  ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์˜์„ฑ/๊ด€์Šต๊ณผ ์œ ์—ฐ์„ฑ ์‚ฌ์ด์— ์ ˆ์ถฉ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ #2568์— ์„ค๋ช…๋œ ๋Œ€๋กœ d.ts ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ(๋˜๋Š” ์ตœ์†Œํ•œ ์ƒ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ)?

@spion ์—ฌ๊ธฐ์— ์ข…์†์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ์—ฌ๋Ÿฌ ์ถœ๋ ฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹จ์ผ ์„ ํƒ ํŒŒ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ์Šคํ…œ์€ ์ด๋ฅผ ์•Œ๊ณ  ์ข…์† ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ž…๋ ฅ์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@mhegazy ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด ์ด๋Š” ์–ธ์–ด ์„œ๋น„์Šค์™€ ๋” ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์Œ์„ ์ฝ์—ˆ๋‹ค

  • ์ค‘๊ฐ„ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ: ํ‘œ์ค€ ๋นŒ๋“œ ๋ฐ ๊ณต์œ  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ

ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๊ฐ€ ์™ธ๋ถ€ ๋ชจ๋“ˆ์ธ npm/browserify(๋˜๋Š” webpack) ๋นŒ๋“œ ์›Œํฌํ”Œ๋กœ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ง€์›๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ž๋™์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

AFAIK ์•„์ง ์™ธ๋ถ€ ๋ชจ๋“ˆ์šฉ .d.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์–ด ์„œ๋น„์Šค๊ฐ€ ์™ธ๋ถ€ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ tsconfig.json์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

{ 
  "provides": "external-module-name"
}

ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹ค๋ฅธ tsconfig.json ์—์„œ ์ฐธ์กฐ๋  ๋•Œ LS์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

AFAIK ์•„์ง ์™ธ๋ถ€ ๋ชจ๋“ˆ์šฉ .d.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. tsc --m --d ํ˜ธ์ถœํ•˜๋ฉด ์™ธ๋ถ€ ๋ชจ๋“ˆ ์ž์ฒด์ธ ์„ ์–ธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋…ผ๋ฆฌ๋Š” .ts๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋™์ผํ•œ ์ด๋ฆ„์˜ .d.ts๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

@spion ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ๋Š” @mhegazy ๋งํ–ˆ๋“ฏ์ด ์™ธ๋ถ€ ๋ชจ๋“ˆ d.ts ํŒŒ์ผ์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 1์—์„œ์ด ๊ฒฐ๊ณผ : ๋„์„œ๊ด€์˜ ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ์˜ ์ •์˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์†Œ๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅธ ์†Œ์Šค ํŒŒ์ผ์— ์ •์˜ 1์˜ ๋น„์œจ. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ TypeStrong ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. https://github.com/TypeStrong/dts-bundle

@mhegazy ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. "์ฃผ๋ณ€ ์™ธ๋ถ€ ๋ชจ๋“ˆ"์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ TypeScript์— external-module-name ๋ฅผ ์“ฐ๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

import {MyClass} from 'external-module-name'

'external-module-name' ๋ฅผ ์„ ์–ธํ•˜๋Š” ์ ์ ˆํ•œ .d.ts ํŒŒ์ผ์„ tsc ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

@nycdotnet dts-bundle ๋ฐ dts-generator ๋ฅผ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์–ธ์–ด ์„œ๋น„์Šค๊ฐ€ ๋‚ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ ์ด๋ฆ„๋„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์˜ ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์ค‘๊ฐ„ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ค‘์š”ํ•œ ์˜ต์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠน์ • "requirejs" ๊ตฌ์„ฑ์œผ๋กœ ๋‹ค๋ฅธ ํด๋”์— ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๊นŒ?

@llgcode https://github.com/Microsoft/TypeScript/issues/5039 ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. typescript@next ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘๊ฐ„ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๋Œ€๋กœ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ์ž‘์—…์œผ๋กœ gulpfile์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ tsconfig.json์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” VS Code ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋จผ์ € ๊ฟ€๊บฝ๊ฟ€๊บฝ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ ์ด๊ฒƒ์€ ๋งค๋ฒˆ ์žฌ์ปดํŒŒ์ผํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ํฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๋งˆ์‹œ๋Š” ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๋ฉด์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@llgcode ๊ธ€์Ž„, gulp.task() ํ•˜์—ฌ ์›ํ•˜๋Š” ๋งŒํผ ์ž‘์—…์„ ์ •์˜ํ•˜๋Š” gulpfile.js๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ๋‚ด์—์„œ gulp.src() ๋กœ ์ž…๋ ฅ ํŒŒ์ผ ์ŠคํŠธ๋ฆผ์„ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ์ปดํŒŒ์ผ, ์—ฐ๊ฒฐ, ์ถ•์†Œ, ์†Œ์Šค ๋งต, ์ž์‚ฐ ๋ณต์‚ฌ์™€ ๊ฐ™์€ ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด .pipe() ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋ฐ NPM ๋ชจ๋“ˆ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.
์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ •์˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ tsconfig.json์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ gulp -typescript ๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜๊ฑฐ๋‚˜ json ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ๋ถ„ ๋นŒ๋“œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ €์žฅ์†Œ์— ์žˆ๊ณ  ํ•˜์œ„ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ๊ฟ€๊บฝํ•˜๋Š” ๊ฒƒ์€ 100% ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„์š” ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. require("mylibs/lib")์™€ ๊ฐ™์€ ๋งคํ•‘์ด ํ•„์š”ํ•˜๊ณ  ๋‚ด ํŒŒ์ผ์ด ์˜ˆ๋ฅผ ๋“ค์–ด project/src/lib.js ํด๋”์— ์žˆ์œผ๋ฉด ์™„์„ฑ์ด ์›์ž์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  typescript ๋˜๋Š” gulp๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งคํ•‘/๊ตฌ์„ฑ์€ "mylibs" ๋ฐ ๋กœ์ปฌ ๊ฒฝ๋กœ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ #5039์— ์žˆ๋Š” ์ด ์ƒˆ๋กœ์šด ์˜ต์…˜ ๊ฒฝ๋กœ๊ฐ€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@llgcode gulp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด glob์ด ํฌํ•จ๋œ ๋ชจ๋“  ํŒŒ์ผ(.d.ts ํŒŒ์ผ ํฌํ•จ)์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( https://www.npmjs.com/package/gulp-typescript#resolve -files ์ฐธ์กฐ).

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

@felixfbecker ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ(์œ ํ˜• ๊ฒ€์‚ฌ ํฌํ•จ)์—๋Š” ์ด์™€ ๊ฐ™์€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
gcc -> ํŒŒ์ผ ํฌํ•จ
์ž๋ฐ” -> ํด๋ž˜์Šค ๊ฒฝ๋กœ ๋ฐ ์†Œ์Šค ๊ฒฝ๋กœ
์ด๋™ -> GOPATH
ํŒŒ์ด์ฌ -> ํŒŒ์ด์ฌ ํŒจ์Šค
์ปดํŒŒ์ผ๋Ÿฌ/ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋˜์–ด์•ผ ํ•˜๋Š” ์†Œ์Šค ํŒŒ์ผ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์†Œ์Šค ํŒŒ์ผ์ด ๋‹จ์ง€ include/lib ํŒŒ์ผ์ธ์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” gulp์™€ ๊ฐ™์€ ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@llgcode ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ TypeScript๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ IDE์— ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ(์‹ค์ œ๋กœ ๊ฐ์ง€) ๋ฐ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์–ธ์–ด ์„œ๋น„์Šค๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ๊ฑธ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@llgcode @unional ์œ ํšจ ํฌ์ธํŠธ. ๋˜ํ•œ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” tsconfig.json์˜ files ์†์„ฑ์ด glob์„ ํ—ˆ์šฉํ•˜๋„๋ก ํ•˜์—ฌ ํฌํ•จํ•˜๋ ค๋Š” ๋ชจ๋“  ํด๋”์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹น์‹ ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€, ์™œ ๋” ํฐ ํ”„๋กœ์ ํŠธ์— ์—ฌ๋Ÿฌ tsconfig.json์ด ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CommonJS์šฉ AFAIK๋Š” node_modules ๋ฐ npm link ../path/to/other-project ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

npm ๋งํฌ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์žฌ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜์ž๋งˆ์ž ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ํ”„๋กœ์ ํŠธ ๊ฐ„์— ๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(rxjs๋ฅผ ์˜ˆ๋กœ ๋“ค์ž๋ฉด) typescript๋Š” 'Observable์„ Observable์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค'๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ด๋Š” ํฌํ•จ ๊ฒฝ๋กœ๊ฐ€ ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ node_modules ํด๋”์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ํด๋”๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ์˜ต์…˜์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” gulp ์ž‘์—… ๋˜๋Š” ๋กœ์ปฌ/๊ฐœ์ธ npm ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

@EricABC ์•„๋งˆ๋„ ์•ฐ๋น„์–ธํŠธ ์™ธ๋ถ€ ๋ชจ๋“ˆ ์„ ์–ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ƒˆ๋กœ ์ง€์›๋˜๋Š” node_modules ๊ธฐ๋ฐ˜ .d.ts ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •์˜๋„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” TS ์œ ํ˜•์ด ๊ตฌ์กฐ์ ์œผ๋กœ๋งŒ ํ™•์ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ตฌ์กฐ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์˜ค๋“  ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ง€๋“  ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.

@spion ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ธฐ๋ฐ˜์ด๋ผ๊ณ  ๊ฐ€์ •

๋˜ํ•œ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” tsconfig.json์˜ files ์†์„ฑ์ด glob์„ ํ—ˆ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค...

ํ† ๋ก  ์ค‘์ธ include ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ ๋ฐ ์˜๊ฒฌ:

  • dependencies ๋Š” tsc๊ฐ€ ํ—ˆ์šฉ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด tsconfig.json ๊ฒฝ๋กœ๋ฅผ
  • files ์ด๋ฏธ ์žˆ๊ณ  ๊ดœ์ฐฎ์€๋ฐ ์ƒˆ ํ‚ค์›Œ๋“œ( dependencies )๋ฅผ ๋„์ž…ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
    ์˜ˆ์‹œ:
{
    "compilerOptions": {
        // ...
    },
    "files": [
        "../common/tsconfig.json", // <== takes the `files` part of the tsconfig.json
        "../common/tsconfig.util.json", // <==
        "core.ts",
        "sys.ts"
    ]
}
  • ์ข…์†์„ฑ tsconfig.json์ด compilerOptions ๋„ ์ง€์ •ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?


๋” ๋ฉ€๋ฆฌ/์•ผ์ƒ์ ์œผ๋กœ :-) ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด (๋ฏธ๋ž˜์—) compilerOptions , exclude ... ๊ฐ€ ๋‹ค๋ฅธ tsconfig.json์„ ์ฐธ์กฐํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

// File app/tsconfig.json
{
    "compilerOptions": "../common/tsconfig.compilerOptions.json",
    "files": [
        "../common/tsconfig.json",
        "../common/tsconfig.util.json",
        "core.ts",
        "sys.ts"
    ],
    "exclude": "../common/exclude.json"
}

// File ../common/tsconfig.compilerOptions.json
{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true
    }
}

// File ../common/exclude.json
{
    "exclude": [
        "node_modules",
        "wwwroot"
    ]
}

// File ../common/tsconfig.util.json
{
    "files": [
        "foo.ts",
        "bar.ts"
    ]
}

files , compilerOptions , exclude ... ๋…ผ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ tsconfig.json ํŒŒ์ผ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ tsconfig์—์„œ ์ผ์น˜ํ•˜๋Š” ํ‚ค์›Œ๋“œ ๋ถ€๋ถ„๋งŒ "๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค" .json ํŒŒ์ผ => ์‰ฝ๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›ํ•˜๋Š” ๊ฒฝ์šฐ tsconfig.json์„ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ† ๋ก ์˜ ์ผ๋ถ€๋ฅผ ์ฝ์œผ๋ฉด ์ด "์–ธ์–ด ์„œ๋น„์Šค"/goto ์ •์˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ฐ€์žฅ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript ๋””๋ฒ„๊ฑฐ๋Š” sourceMaps๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ tsc๊ฐ€ .js๋ฟ๋งŒ ์•„๋‹ˆ๋ผ .d.ts ํŒŒ์ผ์—์„œ๋„ sourceMap ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด...

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

์–ด์จŒ๋“ , .js ํŒŒ์ผ์—์„œ์ฒ˜๋Ÿผ .d.ts ํŒŒ์ผ์—์„œ ์†Œ์Šค ๋งคํ•‘์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ๋…ธ๋“œ ๋ชจ๋“ˆ + npm ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ moduleResolution: node๊ฐ€ ์ธ๋ผ์ธ/ํŠธ๋ฆฌ ์‰์ดํ‚น ์ตœ์ ํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ES6 ๋ชจ๋“ˆ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( #11103 ์ฐธ์กฐ).

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

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

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์ด ๋ฌด์—‡์ด๋“ ๊ฐ„์—, ๋งˆ์นจ๋‚ด ์ „์ฒด ๊ฐœ๋ฐœ ๊ฒฝํ—˜์— ๋Œ€ํ•œ ์šฐ์•„ํ•œ ์†”๋ฃจ์…˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ์ผ์ƒ ์—…๋ฌด์— ์ข‹์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์—์„œ ์ฐจ์ž„!

์›น ๊ฐœ๋ฐœ์˜ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ๊ฐ ํ”„๋กœ์ ํŠธ์—๋Š” ๋‹จ์ผ js ํŒŒ์ผ( --outFile )๋กœ ์ปดํŒŒ์ผ๋œ ์—ฌ๋Ÿฌ ts ํŒŒ์ผ์ด ํฌํ•จ๋œ ์—ฌ๋Ÿฌ ts ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์•ฑ๊ณผ ์œ ์‚ฌํ•œ ํ”„๋กœ์ ํŠธ(ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•จ) ๋˜๋Š” lib์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ(์•ฑ์— ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ)์ž…๋‹ˆ๋‹ค. ์ข…์ข… ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ts-projects ์ค‘ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋™์‹œ์— ์ž‘์—…ํ•˜์—ฌ ์•ฑ ๊ฐœ๋ฐœ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด ๋™๋ฃŒ ๊ฐœ๋ฐœ์ž ์ค‘ ์–ด๋Š ๋ˆ„๊ตฌ๋„ ์–ธ์ œ๋“ ์ง€ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๋ชจ๋“  ts-projects๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์›Œํฌํ”Œ๋กœ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์˜ต์…˜์€

  • 1 ts ํ”„๋กœ์ ํŠธ์— ๋ชจ๋“  ๊ฒƒ์„ ๋˜์ง€์‹ญ์‹œ์˜ค.

    • .ts ํŒŒ์ผ์„ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” d.ts ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค.

    • ๊ทธ๋Ÿฌ๋‚˜ ์•ฑ(๊ธฐ๋Šฅ ๋˜๋Š” ํŽ˜์ด์ง€๋ณ„)์˜ ๋ชจ๋“ˆ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ธํ„ฐ์›น์„ ํ†ตํ•ด ์š”์ฒญ๋œ js ํŒŒ์ผ์„ ์ œํ•œํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ ์„ธํŠธ๋ฅผ ๋งคํ•‘ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์™ธ๋ถ€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    • ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ts-projects๊ฐ€ ํ•ญ์ƒ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋งŽ์€ ํŒฝ์ฐฝ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ X์—์„œ ์ž‘์—…ํ•˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๋Š” ํ”„๋กœ์ ํŠธ A, B, D๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Y์—์„œ ์ž‘์—…ํ•˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๋Š” A์™€ C๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ๋ถ„๋ฆฌ ์œ ์ง€(ํ˜„์žฌ ์ƒํ™ฉ)

    • .ts ํŒŒ์ผ์„ ์ง์ ‘ ํฌํ•จํ•˜๋ฉด ์ถœ๋ ฅ์— ์ถ”๊ฐ€๋˜๋ฏ€๋กœ ๋‹ค๋ฅธ ts-projects์—์„œ ์ปดํŒŒ์ผ๋œ d.ts ํŒŒ์ผ์„ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ž์‹ ์˜ ์†Œ์Šค ์ฝ”๋“œ์— ์ง์ ‘ f12๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด ๋„๊ตฌ/์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ํ„ฐ๋ฏธ๋„์—์„œ tsc -d -w ๋ช…๋ น์„ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ tsconfig๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • ๋‹ค๋ฅธ ๋„๊ตฌ(์˜ˆ: ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๋งˆ์‹œ๋ฉด์„œ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Œ) ๋˜๋Š” tsconfigs์˜ ํŒŒ์ผ globs๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ d.ts ํŒŒ์ผ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์—๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ๋‹จ์ˆœํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฐœ๋ฐœ์„ ์•ฑ๊ณผ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ๋งŒํผ ํฌ์ง€๋Š” ์•Š์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ํ•จ๊ป˜ ๋˜์งˆ ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ž‘์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” typescript์— ์šฐ์•„ํ•œ ์˜ต์…˜์ด ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

dependencies ๊ฐ€ ์ตœ๊ณ ์˜ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ๋Œ€๋‹จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ ๊ธฐ๋Šฅ์ข…์†์„ฑ์˜ ๋ชจ๋“  ts ํŒŒ์ผ์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ํ•ด๋‹น ์ข…์†์„ฑ์˜ ์ž์ฒด tsconfig์— ๋”ฐ๋ผ ์ถœ๋ ฅ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ์—ฌ๋Ÿฌ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? tsconfig.json์—์„œ ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์„ ์–ด๋–ป๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ด์ œ "ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ ์ง€์›"์ด๋ผ๋Š” ์ œ๋ชฉ์˜ ํ–ฅํ›„ ์„น์…˜์˜ ๋กœ๋“œ๋งต์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ .tsconfig ํŒŒ์ผ์€ ๋‹ค๋ฅธ .tsconfig ํŒŒ์ผ์„ ์ข…์†์„ฑ์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ์—ฌ๋Ÿฌ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? tsconfig.json์—์„œ ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์„ ์–ด๋–ป๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋นŒ๋“œ ์ข…์†์„ฑ์€ ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ ์ธ์ฝ”๋”ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. gulp, grunt, broccoli, msbuild, basal ๋“ฑ๊ณผ ๊ฐ™์€ ๋นŒ๋“œ ์‹œ์Šคํ…œ์€ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์œ ํ˜• ์ •๋ณด์˜ ๊ฒฝ์šฐ ํ•œ ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์— .d.ts๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@mhegazy ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” lerna monorepo์—์„œ ํŒจํ‚ค์ง€์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ , ๊ฐ ํŒจํ‚ค์ง€๋Š” package.json์—์„œ ์ž์‹ ์˜ ์ข…์†์„ฑ๊ณผ์˜ ๊ทธ ๊ฐ™์€ ์˜์กด์„ฑ์ด "types" ์ž์‹ ์˜ ์žฌ์‚ฐ tsconfig.json . ๊ฐ ํ”„๋กœ์ ํŠธ๋Š” --outFile (์•„์ง ES ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์€ ์ด์ „ ํ”„๋กœ์ ํŠธ์ž„)๋กœ ์ปดํŒŒ์ผ๋˜๋ฉฐ "typings" package.json ํ‚ค๋Š” ๋ฒˆ๋“ค๋œ .d.ts ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฌถ์Œ/๋ณด๊ธฐ๋ฅผ ์œ„ํ•ด ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • #15488 ๋ฐ #15487๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ฐธ์กฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ช…์‹œ์  ๋งํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • Go-to-definition์€ ๋ฒˆ๋“ค .d.ts ํŒŒ์ผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์ฒด ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์€ lerna run build --sort (๊ฐ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํšจ๊ณผ์ ์œผ๋กœ tsc )์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋งŽ์€ ๋ฐ˜๋ณต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. .

์šฐ๋ฆฌ๋„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ๋ฉด๋ฐ€ํžˆ ์ฃผ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ๊ฐ์˜ tsconfig.json ํŒŒ์ผ์ด ์žˆ๋Š” ์—ฌ๋Ÿฌ "ํ”„๋กœ์ ํŠธ".

@mhegazy๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์ ํŠธ๋Š” .d.ts ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๊ณ  ์ด ํŒŒ์ผ ์€

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

It's happening

๋ง™์†Œ์‚ฌ

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

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ: TypeScript์˜ ๊ธฐ๋ณธ ์ œ๊ณต ํ™•์žฅ์„ฑ

์†Œ๊ฐœ

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

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

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

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

์‹œ๋‚˜๋ฆฌ์˜ค

๊ณ ๋ คํ•ด์•ผ ํ•  ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ๋ชจ๋“ˆ

์ผ๋ถ€ ํ”„๋กœ์ ํŠธ๋Š” ์ƒ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๋””์Šคํฌ์˜ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ../../core/utils/otherMod ์™€ ๊ฐ™์€ ๊ฒฝ๋กœ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ €์žฅ์†Œ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ํ‰ํ‰ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

๋‹ค์Œ์€ Khan Academy์˜ ํŽ˜๋ฅด์„ธ์šฐ์Šค ํ”„๋กœ์ ํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

https://github.com/Khan/perseus/blob/master/src/components/graph.jsx ์—์„œ ์ˆ˜์ •

const Util = require("../util.js");
const GraphUtils = require("../util/graph-utils.js");
const {interactiveSizes} = require("../styles/constants.js");
const SvgImage = require("../components/svg-image.jsx");

๊ด€์ฐฐ

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธ ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ํ™•์ •์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์œ„์˜ Khan Academy ์ƒ˜ํ”Œ์—์„œ ์€ util , styles ๋ฐ components ๊ฐ€ ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋งค์šฐ ์ž‘์•„ ์‹ค์ œ๋กœ ํ•˜๋‚˜์˜ ๋นŒ๋“œ ๋‹จ์œ„๋กœ ๊ทธ๋ฃนํ™”๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋…ธ๋ ˆํฌ

๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ์ƒ๋Œ€๊ฐ€ ์•„๋‹Œ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ๋ชจ๋“ˆ(์˜ˆ: import * as C from 'core/thing )์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ญ์ƒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฐ ๋ฃจํŠธ ๋ชจ๋“ˆ์€ ์‹ค์ œ๋กœ NPM์— ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

https://github.com/angular/angular/blob/master/packages/forms/src/validators.ts ์—์„œ ์ˆ˜์ •

import {InjectionToken, ษตisObservable as isObservable, ษตisPromise as isPromise} from '@angular/core';
import {forkJoin} from 'rxjs/observable/forkJoin';
import {map} from 'rxjs/operator/map';
import {AbstractControl, FormControl} from './model';

๊ด€์ฐฐ

๋‚˜๋ˆ—์…ˆ์˜ ๋‹จ์œ„๋Š” ๋ฐ˜๋“œ์‹œ ๋ชจ๋“ˆ ์ด๋ฆ„์˜ ์„ ๋‘ ๋ถ€๋ถ„์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด rxjs ๋Š” ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ํŒจํ‚ค์ง€(์˜ˆ: @angular/core )์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹ค์ œ๋กœ ํ•˜์œ„ ํŒŒํŠธ( observable , operator )๋ฅผ ๋ณ„๋„๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

์•„์›ƒํŒŒ์ผ

TypeScript๋Š” ์ž…๋ ฅ ํŒŒ์ผ์„ ๋‹จ์ผ ์ถœ๋ ฅ JavaScript ํŒŒ์ผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ ์ง€์‹œ๋ฌธ ๋˜๋Š” tsconfig.json์˜ ํŒŒ์ผ ์ˆœ์„œ๋Š” ๊ฒฐ๊ณผ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฒฐ์ •์  ์ถœ๋ ฅ ์ˆœ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒˆ ํ”„๋กœ์ ํŠธ์—๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ์ด์ „ ์ฝ”๋“œ๋ฒ ์ด์Šค(TypeScript ์ž์ฒด ํฌํ•จ)์—์„œ๋Š” ์—ฌ์ „ํžˆ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

https://github.com/Microsoft/TypeScript/blob/master/src/compiler/tsc.ts

/// <reference path="program.ts"/>
/// <reference path="watch.ts"/>
/// <reference path="commandLineParser.ts"/>

https://github.com/Microsoft/TypeScript/blob/master/src/harness/unittests/customTransforms.ts

/// <reference path="..\..\compiler\emitter.ts" />
/// <reference path="..\harness.ts" />

๊ด€์ฐฐ

์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ์†”๋ฃจ์…˜์€ ๋ณ„๋„์˜ script ํƒœ๊ทธ(๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ํƒœ๊ทธ)๋ฅผ ํ†ตํ•ด ๊ฐ outFile ๋ฅผ ๋กœ๋“œํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜(์˜ˆ: TypeScript ์ž์ฒด)์€ ๋ชจ๋†€๋ฆฌ์‹ ์ถœ๋ ฅ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ: ์ƒˆ๋กœ์šด ๊ฒฉ๋ฆฌ ๋‹จ์œ„

์‹ค์ œ ํ”„๋กœ์ ํŠธ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์—์„œ ์–ป์€ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ด€์ฐฐ:

  • TypeScript๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌํ˜„(๋น„.d.ts) ์ฝ”๋“œ์˜ 50,000 LOC ๋ฏธ๋งŒ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•  ๋•Œ "๋น ๋ฅธ"(< 5-10์ดˆ)์ž…๋‹ˆ๋‹ค.
  • .d.ts ํŒŒ์ผ, ํŠนํžˆ skipLibCheck ์•„๋ž˜์˜ ํŒŒ์ผ์€ ์œ ํ˜• ๊ฒ€์‚ฌ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ ์ธก๋ฉด์—์„œ ๊ฑฐ์˜ "๋ฌด๋ฃŒ"์ž…๋‹ˆ๋‹ค.
  • ๊ฑฐ์˜ ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด๋Š” 50,000 LOC๋ณด๋‹ค ์ž‘์€ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์„ธ๋ถ„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฑฐ์˜ ๋ชจ๋“  ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ฏธ ์ ๋‹นํ•œ ํฌ๊ธฐ์˜ ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ณ„๋กœ ํŒŒ์ผ์„ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ํŽธ์ง‘์€ ์ „์ฒด ์†”๋ฃจ์…˜์„ ๋‹ค์‹œ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ ๋˜๋Š” ๋‹ˆ์–ด ๋ฆฌํ”„ ๋…ธ๋“œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ๋“ค์„ ์ข…ํ•ฉํ•˜๋ฉด, ๊ตฌํ˜„ ์ฝ”๋“œ์˜ 50,000 LOC ์ฒญํฌ ํ•˜๋‚˜๋งŒ ํ•œ ๋ฒˆ์— ์œ ํ˜• ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋Œ€ํ™”ํ˜• ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ "๋Š๋ฆฐ" ์ƒํ˜ธ ์ž‘์šฉ์ด ๊ฑฐ์˜ ์—†๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฑฐ์˜ ๋ถ€์กฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข…์† ๋‹จ์œ„์˜ ๊ตฌํ˜„ ์ฝ”๋“œ๊ฐ€ ํ™•์ธ ๋˜์ง€ ์•Š๋Š” ๋‘ TypeScript ์ปดํŒŒ์ผ ๋‹จ์œ„ ๊ฐ„์— ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์ข…์†์„ฑ์„ ์„ ์–ธํ•˜๋Š” ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ ๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ๊ฒฐ์ •์  ์œ„์น˜์—์„œ .d.ts ์ถœ๋ ฅ์„ ๋กœ๋“œํ•˜๊ธฐ

ํ†ต์‚ฌ๋ก 

์ƒˆ๋กœ์šด references ์˜ต์…˜(TODO: Bikeshed!)์ด tsconfig.json ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

{
  "extends": "../tsproject.json",
  "compilerOptions": {
    "outDir": "../bin",
    "references": [
      { "path": "../otherProject" }
    ]
  }
}

references ๋ฐฐ์—ด์€ ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ฐธ์กฐํ•  ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ ์„ธํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ references ๊ฐœ์ฒด์˜ path ๋Š” tsconfig.json ํŒŒ์ผ ๋˜๋Š” tsconfig.json ํŒŒ์ผ์ด ํฌํ•จ๋œ ํด๋”๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋“ค์˜ ํ•„์š”๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๋Œ€๋กœ ์ด ๊ฐœ์ฒด์— ๋‹ค๋ฅธ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜๋ฏธ๋ก 

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋Š” ๋‹ค์Œ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“ˆ ํ™•์ธ์ด ํ”„๋กœ์ ํŠธ rootDir ์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” .ts ํŒŒ์ผ๋กœ ํ•ด์„๋˜๋ฉด ๋Œ€์‹  ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ outDir ์— ์žˆ๋Š” .d.ts ํŒŒ์ผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

    • ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์‹คํŒจํ•˜๋ฉด ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋‹จ์ˆœํ•œ "ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ" ๋Œ€์‹  Referenced project "../otherProject" is not built ์™€ ๊ฐ™์€ ๋” ๋˜‘๋˜‘ํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค(TODO: ์ง€๊ธˆ๊นŒ์ง€?)

์ฐธ์กฐ ํ”„๋กœ์ ํŠธ ์ˆ˜ํ–‰์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

๋นŒ๋“œ ์„ฑ๋Šฅ์„ ์˜๋ฏธ ์žˆ๊ฒŒ ๊ฐœ์„ ํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ๋ณผ ๋•Œ TypeScript์˜ ๋™์ž‘์„ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ๋‹ค์Œ ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์˜ ์ž…๋ ฅ .ts ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ๊ตฌ๋ฌธ ๋ถ„์„ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ๋งŒ tsconfig.json ์ฐธ์กฐ ๋œ ํ”„๋กœ์ ํŠธ๋Š” ๋””์Šคํฌ๋กœ๋ถ€ํ„ฐ ์ฝ์–ด์•ผ
  • ์ตœ์‹  ๊ฒ€์‚ฌ๋Š” ์œ„์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์•ฝ์†์„ ์ง€ํ‚ค๋ ค๋ฉด ์ฐธ์กฐํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • declaration ๋Š” ์ž๋™์œผ๋กœ true ๋ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ ๋ฌด์‹œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • rootDir ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž…๋ ฅ ํŒŒ์ผ ์„ธํŠธ์—์„œ ์ถ”๋ก ๋˜์ง€ ์•Š๊ณ  "." ( tsconfig.json ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ)๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • files ๋ฐฐ์—ด์ด ์ œ๊ณต๋˜๋ฉด ๋ชจ๋“  ์ž…๋ ฅ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ์™ธ: ์œ ํ˜• ์ฐธ์กฐ์˜ ์ผ๋ถ€๋กœ ํฌํ•จ๋œ ํŒŒ์ผ(์˜ˆ: node_modules/@types )์€ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ์ฐธ์กฐ๋˜๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—๋Š” references ๋ฐฐ์—ด์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ).

์™œ "declaration": true ์ž…๋‹ˆ๊นŒ?

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋Š” ๊ตฌํ˜„ ํŒŒ์ผ(.ts) ๋Œ€์‹  ์„ ์–ธ ํŒŒ์ผ(.d.ts)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋‹น์—ฐํžˆ ์ฐธ์กฐ๋œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—๋Š” declaration ์„ค์ •์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ "project": true ์˜ํ•ด ์•”์‹œ๋ฉ๋‹ˆ๋‹ค.

rootDir ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

rootDir ๋Š” ์ž…๋ ฅ ํŒŒ์ผ์ด ์ถœ๋ ฅ ํŒŒ์ผ ์ด๋ฆ„์— ๋งคํ•‘๋˜๋Š” ๋ฐฉ์‹์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. TypeScript์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ ์ž…๋ ฅ ํŒŒ์ผ์˜ ์ „์ฒด ๊ทธ๋ž˜ํ”„์˜ ๊ณตํ†ต ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ["src/a.ts", "src/b.ts"] ์ž…๋ ฅ ํŒŒ์ผ ์„ธํŠธ๋Š” ["a.js", "b.js"] ์ถœ๋ ฅ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ["src/a.ts", "b.ts"] ์ž…๋ ฅ ํŒŒ์ผ ์„ธํŠธ๋Š” ["src/a.js", "b.js"] ์ถœ๋ ฅ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

์›ํ˜• ์—†์Œ

๋‹น์—ฐํžˆ ํ”„๋กœ์ ํŠธ๋Š” ์›ํ˜•์ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ํ˜•์„ฑํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (TODO: ๋นŒ๋“œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์•…๋ชฝ ์™ธ์— ์‹ค์ œ๋กœ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?) ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜•์„ฑ๋œ ์ˆœํ™˜ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

TS6187: Project references may not form a circular graph. Cycle detected:
    C:/github/project-references-demo/core/tsconfig.json ->
    C:/github/project-references-demo/zoo/tsconfig.json ->
    C:/github/project-references-demo/animals/tsconfig.json ->
    C:/github/project-references-demo/core/tsconfig.json

tsbuild

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

" bar ๊ฐ€ ์•„์ง ๋นŒ๋“œ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— foo ๋นŒ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ช…๋ฐฑํ•œ "๊ฐ€์„œ ๊ฐ€์ ธ์˜ค๊ธฐ" ์ข…๋ฅ˜์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์˜ ์ •์‹ ์  ๋ถ€๋‹ด๋ณด๋‹ค

gulp , webpack ๋“ฑ๊ณผ ๊ฐ™์€ ๋„๊ตฌ(๋˜๋Š” ํ•ด๋‹น TS ํ”Œ๋Ÿฌ๊ทธ์ธ)๊ฐ€ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ตœ์‹  ํ™•์ธ์„ ํฌํ•จํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋นŒ๋“œ ์ข…์†์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ฐ€๋Šฅ ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋™์ž‘์„ ๋ณด์—ฌ์ฃผ๋Š” TypeScript ๋นŒ๋“œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋„๊ตฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ ๊ตฌํ˜„ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๋น ๋ฅธ ์ตœ์‹  ํ™•์ธ
  • ํ”„๋กœ์ ํŠธ ๊ทธ๋ž˜ํ”„ ์ˆœ์„œ
  • ๋ณ‘๋ ฌํ™” ๊ตฌ์ถ•
  • (TODO: ๋‹ค๋ฅธ ์‚ฌ๋žŒ?)

์ด ๋„๊ตฌ๋Š” ๊ณต๊ฐœ API๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ๋นŒ๋“œ ๋„๊ตฌ ์ž‘์„ฑ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ์ž˜ ๋ฌธ์„œํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•  ๊ฒƒ

์ด ์ œ์•ˆ์„ ์™„์ „ํžˆ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„์›Œ์•ผ ํ•  ์„น์…˜

  • ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

    • ๊ธฐ๋ณธ์ ์œผ๋กœ tsconfig.json ํŒŒ์ผ์„ ๋“œ๋กญํ•œ ๋‹ค์Œ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฐธ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • baseUrl ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

    • ๊ตฌํ˜„์„ ์–ด๋ ต๊ฒŒ ํ•˜์ง€๋งŒ ํšจ๊ณผ์ ์œผ๋กœ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ

  • ์ค‘์ฒฉ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๋…ผ์˜(TL, DR ํ—ˆ์šฉํ•ด์•ผ ํ•จ)
  • "๋„ˆ๋ฌด ํฐ" ํ”„๋กœ์ ํŠธ๋ฅผ ์†Œ๋น„์ž๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋” ์ž‘์€ ํ”„๋กœ์ ํŠธ๋กœ ์„ธ๋ถ„ํ™”ํ•˜๋Š” ๊ฐœ์š” ์‹œ๋‚˜๋ฆฌ์˜ค
  • Lerna ์‹œ๋‚˜๋ฆฌ์˜ค ํŒŒ์•…

    • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ(N = 1)๋Š” ๋นŒ๋“œ๊ฐ€ ์ด๋ฏธ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

    • ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์˜ˆ ๋˜๋Š” ๋ฐ˜๋ก€๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด webpack/babel/rollup์„ ํ†ตํ•ด JS๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด dtsEmitOnly ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

    • ์•„๋งˆ๋„ references + noEmit ์ด๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค

ํ™˜์ƒ์ ์ด์•ผ!

Lerna ์‹œ๋‚˜๋ฆฌ์˜ค ํŒŒ์•…

  • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ(N = 1)๋Š” ๋นŒ๋“œ๊ฐ€ ์ด๋ฏธ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

"์ด๊ฒƒ"์€ ์ œ์•ˆ ๋˜๋Š” ์ฐธ์กฐ ๋นŒ๋“œ ๊ตฌํ˜„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๊นŒ? lerna๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(์ €ํฌ ํŒ€์ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค), TS(๋˜๋Š” ์ด ์ œ์•ˆ์—์„œ ๋นŒ๋“œ๋œ ๋„๊ตฌ)๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ์—‰์„ฑํ•˜๊ณ  ํ›จ์”ฌ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

TODO ์„น์…˜์€ ์ „์ฒด ์ œ์•ˆ์— ๋Œ€ํ•œ TODO์ž…๋‹ˆ๋‹ค.

๋ฉ‹์ง„!

์ฐธ์กฐ๋˜๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—๋Š” ์ฐธ์กฐ ๋ฐฐ์—ด์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ).

์ด๊ฒƒ์ด ์ •๋ง ํ•„์š”ํ•œ๊ฐ€? ์ด๋Ÿฌํ•œ ํŒจํ‚ค์ง€์— .d.ts ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„๊นŒ์š”?
(์ด ๊ฒฝ์šฐ tsconfig.json ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ฃ ?)

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€: outDir ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” (์˜ˆ: ํƒ€์‚ฌ) ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ ๋ คํ•˜๋ฉด .ts , .js ๋ฐ .d.ts ์˜†์— ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋กœ, ๊ทธ๋ฆฌ๊ณ  TS๋Š” ํ˜„์žฌ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค .ts ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  .d.ts .

๋‚˜๋ฅผ ์œ„ํ•ด outDir ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” import "package/subthing" ์Šคํƒ€์ผ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด import "package/dist/subthing" with outDir: "dist" ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  NPM ํŒจํ‚ค์ง€๋‚˜ ์†Œ์Šค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: npm link ).

( package.json ๊ฐ€ main ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„์•„...)

์˜ˆ๋ฅผ ๋“ค์–ด webpack/babel/rollup์„ ํ†ตํ•ด JS๋ฅผ ํŒŒ์ดํ”„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด dtsEmitOnly ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ „์ ์œผ๋กœ! ์ด๊ฒƒ์€ ํ˜„์žฌ ํฐ ๋ˆ„๋ฝ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ outFile ์‚ฌ์šฉํ•  ๋•Œ ๋‹จ์ผ d.ts ํŒŒ์ผ์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋“ˆ๋กœ ์ „ํ™˜ํ•˜๊ณ  ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๊ฒƒ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์˜ ์ง„์ž…์ ( export as namespace MyLib )์— ๋Œ€ํ•ด ๋‹จ์ผ d.ts ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋†€๋ผ์šด ์ผ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋„๊ตฌ๊ฐ€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ด๋ฏธํ„ฐ ๋ฐ ์–ธ์–ด ์„œ๋น„์Šค์— ํ†ตํ•ฉ๋œ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ •๋ง ํ•„์š”ํ•œ๊ฐ€? ๊ทธ๋Ÿฌํ•œ ํŒจํ‚ค์ง€์— .d.ts ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„๊นŒ์š”?

์ถœ๋ ฅ ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•  ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋Œ€์ƒ tsconfig์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์˜ ์ด์ „ ๋ฒ„์ „์—๋Š” "๋ช…์‹œ์ ์ธ rootDir ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค"๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ์ด๋Š” ๋‹ค์†Œ ๋ฒˆ๊ฑฐ๋กœ์› ์Šต๋‹ˆ๋‹ค(๋ชจ๋“  tsconfig์—์„œ "rootDir": "." ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•จ). ์šฐ๋ฆฌ๋Š” ์ด ์„ธ์ƒ์—์„œ ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ๋’ค์ง‘๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ๋ฐฐ์—ด์ด ์žˆ๊ณ  ํ‚ค์˜คํ”„๋œ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ "ํ”„๋กœ์ ํŠธ" ๋™์ž‘์„ ์–ป๋Š”๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ๋ช…์‹œํ•ด์•ผ ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์€ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ TypeScript ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•œ ๋ฐฉ์‹๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ๊ฐ tsconfig.json์ด ์žˆ๊ณ  ๊ฟ€๊บฝ๊ฟ€๊บฝ(gulp)์„ ํ†ตํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ๋นŒ๋“œ๋˜๋Š” ๋” ์ž‘์€ ๋‹จ์œ„๋กœ ์„ธ๋ถ„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋Š” d.ts ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ƒ์ ์ธ ์„ธ๊ณ„์—์„œ๋Š” ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๋นŒ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰. TypeScript๋Š” ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์˜ "๋นŒ๋“œ"๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์–ธ์–ด ์„œ๋น„์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” "d.ts"๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด "์†Œ์Šค" ํ”„๋กœ์ ํŠธ์—์„œ ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•  ํ•„์š” ์—†์ด "์ข…์†" ํ”„๋กœ์ ํŠธ์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•  ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋Œ€์ƒ tsconfig์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

outDir ๊ฐ€ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ๊ณผ ๊ฐ™์ด: tsconfig๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ:

  • outDir ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  declaration: true ). ๊ทธ๋Ÿฌ๋ฉด rootDir ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. references ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • outDir ๊ฐ€ ์žˆ์œผ๋ฉด references ๋ฐ/๋˜๋Š” rootDir (๋ฐ declaration: true )๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธํ•˜๋Š” ์ด์œ ๋Š” ๋ชจ๋“  TS ํŒจํ‚ค์ง€๋ฅผ ์ฐธ์กฐํ•˜์—ฌ 'ํ”„๋กœ์ ํŠธ ๋ชจ๋“œ'๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ œ ์ œ์–ด์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์ฐพ๊ณ  ์žˆ๋Š” .d.ts ํŒŒ์ผ์„ ์ฐพ๋Š” ์ฆ‰์‹œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ฆ‰, .ts ํŒŒ์ผ์ด๋‚˜ tsconfig ํŒŒ์ผ์ด ์—†์œผ๋ฉด ๋ถˆํ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ํ•„์š”ํ•œ ๊ฒฝ์šฐ NPM ๋ฒ„์ „(.d.ts ํŒŒ์ผ๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ์Œ)์„ ํ•ด๋‹น ์†Œ์Šค ๋ฒ„์ „์œผ๋กœ '๊ต์ฒด'ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด NPM ํŒจํ‚ค์ง€ MyApp ๋ฐ SomeLib๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
SomeLib์—๋Š” tsconfig: declaration: true ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ €์žฅ์†Œ:

package.json
tsconfig.json
index.ts
sub.ts

์ปดํŒŒ์ผํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

package.json
tsconfig.json
index.ts
index.d.ts
index.js
sub.ts
sub.d.ts
sub.js

์ด ๊ตฌ์กฐ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด

// somewhere in MyApp
import something from "SomeLib/sub";

๊ฒŒ์‹œ๋œ NPM ํŒจํ‚ค์ง€์—์„œ ํ˜„์žฌ ํ•ญ์ƒ .ts ํŒŒ์ผ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด MyApp์—์„œ SomeLib๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์†Œ์Šค๊ฐ€ TS์—์„œ ๋‹ค์‹œ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ NPM์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

package.json
index.d.ts
index.js
sub.d.ts
sub.js

์ด์ œ MyApp์˜ tsconfig์— references: ["SomeLib"] ๋ฅผ ๋„ฃ์œผ๋ฉด NPM ๋ฒ„์ „๊ณผ SomeLib์˜ ์†Œ์Šค ๋ฒ„์ „ ๋ชจ๋‘์— ๋Œ€ํ•ด '์žˆ๋Š” ๊ทธ๋Œ€๋กœ' ์ž‘๋™ ํ•˜๋Š” ๊ฒƒ์ด sub.d.ts ๋ฅผ ์ฐพ๋Š” ํ•œ.


๊ด€๋ จ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ์งˆ๋ฌธ:

SomeLib ์˜ ์ž‘์„ฑ์ž๊ฐ€ ์ž์‹ ์˜ tsconfig์— references ๋ฅผ ๋„ฃ์œผ๋ฉด ๋‚˜์ค‘์— .ts ํŒŒ์ผ์ด ์žˆ๋Š” NPM ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ด์ œ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ข…์† ํŒจํ‚ค์ง€๊ฐ€ tsconfig์— references: ["SomeLib"] ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋„ฃ์ง€ ์•Š์€ ๊ฒฝ์šฐ TS๊ฐ€ ์—ฌ์ „ํžˆ ์ด๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด MyLib์˜ references ๊ฐ€ import 'ํ•  ๋•Œ(์ฆ‰, references 'ํ•˜์ง€ ์•Š์Œ) 'ํ”„๋กœ์ ํŠธ ๊ฒฝ๊ณ„'๋„ ์ž๋™์œผ๋กœ ๋„์ž…ํ•˜๋ ค๋Š” ์˜๋„์ž…๋‹ˆ๊นŒ?

IIRC, ์ดˆ๊ธฐ ์•„์ด๋””์–ด ์ค‘ ํ•˜๋‚˜๋Š” ๋ชจ๋“ˆ์ด ์˜ˆ๋ฅผ ๋“ค์–ด node_modules ๋ฅผ ํ†ตํ•ด ์ฐพ์€ ๊ฒฝ์šฐ .d.ts ํŒŒ์ผ์ด .ts ํŒŒ์ผ๋ณด๋‹ค ์„ ํ˜ธ๋˜์ง€๋งŒ ๋‚˜์ค‘์— ๋‹ค์‹œ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. , ๋ฐœ๊ฒฌ์  ๋ฐฉ๋ฒ•("through node_modules ")์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋„ˆ๋ฌด ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ 'ํ”„๋กœ์ ํŠธ ๊ฒฝ๊ณ„'๊ฐ€ ์žˆ์œผ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: projectRoot: true ๋Œ€์‹  ๋˜๋Š” ์ถ”๊ฐ€๋กœ references )?

lerna์˜ ๊ฒฝ์šฐ ๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํŒจํ‚ค์ง€๋Š” ๋ชจ๋…ธ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ตฌ์กฐ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค . ๊ฐœ๋ณ„ tsconfig JSON ํŒŒ์ผ ์ฐธ์กฐ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€๋ฅผ ๋ณ„๋„์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๊ธฐ๋ณธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋„๊ตฌ์—์„œ ์ด๋ฅผ ๋ณต์ œํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ProseMirror: https://github.com/ProseMirror/prosemirror).

  2. ๋ฃจํŠธ "์ž‘์—… ๊ณต๊ฐ„" ๋ฆฌํฌ์ง€ํ† ๋ฆฌ(๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹จ์ˆœํžˆ ๋‹ค๋ฅธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ณต์ œํ•  ์ˆ˜๋„ ์žˆ์Œ)์—์„œ tsconfig.json์— ์ฐธ์กฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์ด๊ฒƒ์€ ๋„๊ตฌ๊ฐ€ .d.ts ํŒŒ์ผ๋กœ ์ด๋™ํ•˜๋Š” ๋Œ€์‹  ์†Œ์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ธ์‹ํ•˜๊ณ  ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‚ด ์ „์ฒด ๊ด€์‹ฌ์‚ฌ๋Š” ๊ฐœ๋ณ„ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๋‚ด๋ฆผ์ฐจ์ˆœ "../xx" ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋” ์ด์ƒ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜

"์ž‘์—… ๊ณต๊ฐ„" tsconfig.json์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€๋ฅผ "git clone"ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ข…์†์„ฑ์„ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•(์˜ˆ: npm ๋˜๋Š” yarn ์‚ฌ์šฉ)์œผ๋กœ ์„ค์น˜ํ•˜๋ฉด ์ปดํŒŒ์ผ๋œ ์ข…์†์„ฑ์ด ์ •์˜ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ž‘์—… ๊ณต๊ฐ„์„ ๋ณต์ œํ•˜๊ณ  ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์ž‘์—… ๊ณต๊ฐ„ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ๋ชจ๋“  ์†Œ์Šค๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

tsconfig.json ์ž‘์—… ๊ณต๊ฐ„๋„ Yarn์˜ ์ž‘์—… ๊ณต๊ฐ„ package.json https://yarnpkg.com/lang/en/docs/workspaces/ ์™€ ์™„๋ฒฝํ•˜๊ฒŒ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์•ฝ๊ฐ„์˜ ๊ฐœ๋… ์ฆ๋ช…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/spion/typescript-workspace-plugin

๊ฐœ๋ณ„ ์ €์žฅ์†Œ์˜ ๋ชจ๋“  tsconfig.json ํŒŒ์ผ์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ

{
  "plugins": [{"name": "typescript-workspace-plugin"}]
}

๊ทธ๋Ÿฐ ๋‹ค์Œ yarn์˜ "workspaces" ํ•ญ๋ชฉ๊ณผ ํ•จ๊ป˜ ์ตœ์ƒ์œ„ package.json์— "workspace-sources" ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{
  "workspaces": ["packages/*"],
  "workspace-sources": {
    "*": ["packages/*/src"]
  }
}

์ด ํ•„๋“œ๋Š” tsconfig.json์˜ "๊ฒฝ๋กœ" ํ•„๋“œ์™€ ์™„์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ํŒจํ‚ค์ง€ ์†Œ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐœ๋ณ„ ํ”„๋กœ์ ํŠธ์˜ ์–ธ์–ด ์„œ๋น„์Šค์—๋งŒ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. ์ ์ ˆํ•œ "์ •์˜/์œ ํ˜•์œผ๋กœ ์ด๋™" ๊ธฐ๋Šฅ ๋“ฑ์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ outDir์ด ์‚ฌ์šฉ๋  ๋•Œ๋งŒ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ณ์€. ์šฐ๋ฆฌ๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ง„ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด outDir ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์ œ MyApp์˜ tsconfig์— ["SomeLib"] ์ฐธ์กฐ๋ฅผ ๋„ฃ์œผ๋ฉด NPM ๋ฒ„์ „๊ณผ SomeLib์˜ ์†Œ์Šค ๋ฒ„์ „ ๋ชจ๋‘์—์„œ '์žˆ๋Š” ๊ทธ๋Œ€๋กœ' ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋น… ํŒฌ, ๋‚˜๋Š” ์ด ์•„์ด๋””์–ด๋ฅผ ์•„์ฃผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ํ•„์š”ํ•œ์ง€ ์•„๋‹Œ์ง€ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ํ•œ ๊ฐ€์ง€์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ๋‚ด๊ฐ€ b)๋Š” ์–ด๋Š ์ชฝ๋„ ๊ฒŒ์‹œํ•˜์ง€ ๋งŒ .d.ts์— ๋„๋‹ฌ ํ•  ํŒŒ์ผ์ด ํŒจํ‚ค์ง€์˜ ์ €์ž) ์ค‘ ํ•˜๋‚˜์— ํ•„์š” TS ๊ทธ๋“ค์„ ๋ฐœ๊ฒฌ ํ•œ ๊ณณ์˜ ์žฅ์†Œ์—์„œ ํ•จ๊ป˜ ๋‘ .TS ๋ฐ tsconfig ํŒŒ์ผ์„ ๊ฒŒ์‹œ ์ƒ๊ฐ, ๋˜๋Š”์ด๋‹ค. (a)์˜ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋”ฐ๋ฅด๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ผ์ด ๋ฐœ์ƒํ•˜๊ณ  (b)์˜ ๊ฒฝ์šฐ ์ž˜๋ชป๋œ ์œ„์น˜๋กœ ์ŠคํŒŒ์ด๋” ์•„์›ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด MyLib์˜ ์ฐธ์กฐ๊ฐ€ ๊ทธ๋ƒฅ ๊ฐ€์ ธ์˜ฌ ๋•Œ(์ฆ‰, ์ฐธ์กฐํ•˜์ง€ ์•Š์Œ) ์ž๋™์œผ๋กœ 'ํ”„๋กœ์ ํŠธ ๊ฒฝ๊ณ„'๋„ ๋„์ž…ํ•˜๋ ค๋Š” ์˜๋„์ž…๋‹ˆ๊นŒ?

@mhegazy ์™€ ์ด์•ผ๊ธฐ๋ฅผ references ๋ฐฐ์—ด์ด ์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋Š” ํ”„๋กœ์ ํŠธ ํด๋” ์™ธ๋ถ€์˜ .ts ํŒŒ์ผ์„ ์ ˆ๋Œ€ "๋ณด์ง€" exclude d ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ๋งŒ์œผ๋กœ๋„ lerna ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์—…("๋ชจ๋“ˆ ์ฐธ์กฐ๋Š” ํ•ญ์ƒ .d.ts๋กœ ํ™•์ธ๋จ"์„ ์˜๋ฏธํ•˜๋Š” "์ž‘์—…")๊ณผ ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์ž‘์—… ๊ณต๊ฐ„" ๋ชจ๋ธ์„ ๋” ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ outDir์ด ์‚ฌ์šฉ๋  ๋•Œ๋งŒ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ณ์€. ์šฐ๋ฆฌ๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ง„ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด outDir์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Visual Studio ์†”๋ฃจ์…˜์—๋Š” outdir ์—†์ด ์ปดํŒŒ์ผ๋œ 67๊ฐœ์˜ TS ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๊ณ  ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ postbuild grunttasks(๋ฐ uglify ๋ฐ ๊ธฐํƒ€ ํ›„์ฒ˜๋ฆฌ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—๋Š” ์ด๋Ÿฌํ•œ tsconfig.json์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 "include": [
    "../baseProj/Lib/jquery.d.ts",
    "../baseProj/baseProj.d.ts"
  ]

๋‚˜๋Š” ์ฐธ์กฐ ์ œ์•ˆ์„ ์ฝ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ณ  ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. AFAICT lerna ๋ฐ yarn ์ž‘์—… ๊ณต๊ฐ„ ์‚ฌ์šฉ์ž๋Š” ์—ฌ๊ธฐ์— ์ œ์•ˆ๋œ ์ž‘์—… ๊ณต๊ฐ„ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ package.json์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆœ์„œ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, lerna์—๋Š” ์ด๊ฒƒ์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ์‹คํ–‰ ๋ช…๋ น์ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋„ ์ถ”๊ฐ€ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. skipLibCheck ๋Š” ์„ฑ๋Šฅ ์˜ํ–ฅ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•˜์ง€๋งŒ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  2. Lerna์™€ Yarn์€ ์ด๋ฏธ ์ ์ ˆํ•œ node_modules ์œ„์น˜์— ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ๋“  ์ข…์† ํ•ญ๋ชฉ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ package.json์„ ๋”ฐ๋ฅด๊ณ  ์œ ํ˜•/์œ ํ˜• ํ•„๋“œ๋ฅผ ์ฝ๊ณ  ์ฐธ์กฐ๋œ module.d.ts ์œ ํ˜• ์ •์˜ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฒƒ๊ณผ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“  ์†Œ์Šค๋ฅผ ๋™์‹œ์— ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ชจ๋“ˆ์„ ๋™์‹œ์— ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ "์ •์˜๋กœ ์ด๋™" ๋ฐ "์œ ํ˜• ์ •์˜๋กœ ์ด๋™"์„ ํ†ตํ•ด .d.ts ํŒŒ์ผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์›๋ž˜ ์†Œ์Šค ์ฝ”๋“œ ์œ„์น˜๋กœ ๋‚˜๋ฅผ ๋ณด๋‚ด๊ธธ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ณ„ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด lerna/yarn์— ์˜ํ•ด ์ƒ์„ฑ๋œ node_modules ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. Lerna ๋Œ€์‹  Rush ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ณ„์‚ฐํ•˜์ง€๋งŒ ํšจ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ tsc ๋Š” ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋งŽ์€ ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์€ ๋” ํฐ ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ ๊ณ„์‚ฐ๋˜๋ฉฐ tsconfig.json ์ด ์ž…๋ ฅ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ์ƒ์„ฑ๋œ ์ถœ๋ ฅ(์ฃผ๋กœ VS Code์˜ ์ด์ ์„ ์œ„ํ•ด)์ธ ๋ชจ๋ธ๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

+1 ์ด๊ฒƒ์€ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ์ง€์›์„ ๊ฟˆ๊พธ๋Š” ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์€ VS Code IntelliSense ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. Rush๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ ์—”์ง„์„ 100๋ฒˆ ํšŒ์ „ํ•˜์ง€ ์•Š๊ณ ๋„ tsc 100๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋นŒ๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ๋นจ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ€์žฅ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๋นŒ๋“œ ๋‹จ๊ณ„ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ชจ๋…ธ๋ ˆํฌ์—์„œ๋Š” ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@ylanton @nickpape-msft @qz2017

์˜ˆ, ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค!

ํ”„๋กœ์ ํŠธ ์‹œ์Šคํ…œ์˜ ๊ฐ€์žฅ ์œ ์šฉํ•œ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
'์ •์˜๋กœ ์ด๋™'์€ d.ts ํŒŒ์ผ ๋Œ€์‹  ์†Œ์Šค ํŒŒ์ผ๋กœ ์ด๋™ํ–ˆ์œผ๋ฉฐ
ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด '๋ชจ๋“  ์ฐธ์กฐ ์ฐพ๊ธฐ'๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด๊ฒƒ์€ '์ „์—ญ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ' ์œ ํ˜• ๋ฆฌํŒฉํ† ๋ง๋„ ์ž ๊ธˆ ํ•ด์ œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2017๋…„ 11์›” 9์ผ ๋ชฉ์š”์ผ ์˜คํ›„ 9์‹œ 30๋ถ„ Salvatore Previti [email protected]
์ผ๋‹ค:

์˜ˆ, ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค!

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/Microsoft/TypeScript/issues/3469#issuecomment-343356868 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AANX6d19Zz7TCd_GsP7Kzb-9XJAisG6Hks5s07VXgaJpZM4E-oPT
.

@mhegazy ์™€ ์ด์•ผ๊ธฐ๋ฅผ

์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ํŠน์ • ์ฐธ์กฐ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
ํ”Œ๋ž˜๊ทธ(์˜ˆ projectRoot: true )๊ฐ€ ์žˆ์œผ๋ฉด ์ถฉ๋ถ„ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด references: ["foo"] ์™€ references: [] ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋‚ด๊ฐ€ import "foo" ๋˜๋Š” import "bar" ์ด๋ฉด ๋‘˜ ๋‹ค .ts ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ์ œ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด tsconfig.json( projectRoot TODO ์ž์ „๊ฑฐ ๋ณด๊ด€์†Œ):

{
  "extends": "../tsproject.json",
  "compilerOptions": {
    "projectRoot": true
   }
}

tsc ๊ฐ€ ํ”„๋กœ์ ํŠธ ํด๋” ์™ธ๋ถ€์˜ ํ•ญ๋ชฉ(์ œ์™ธ๋œ ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์˜ ํŒŒ์ผ ํฌํ•จ)์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋•Œ .d.ts ํŒŒ์ผ๋งŒ ๋ด…๋‹ˆ๋‹ค(๋˜๋Š” .d.ts _์„ ํ˜ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋ณด๊ณ  tsconfig ๋ฐ/๋˜๋Š” .ts ๋˜๋Œ์•„๊ฐ€๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น).

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ ์ค‘ ํ•ด๊ฒฐ์ด ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•ด์ง‘๋‹ˆ๋‹ค.
๋ชจ๋…ธ๋ ˆํฌ ์ฐธ์กฐ(์˜ˆ: import "../foo" ) ๋ฐ ํŒจํ‚ค์ง€ ๊ธฐ๋ฐ˜ ์ฐธ์กฐ(์˜ˆ: import "foo" )์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
NPM ํŒจํ‚ค์ง€ ๋ฐ ํ•ด๋‹น ์†Œ์Šค ์ฝ”๋“œ ํ‘œํ˜„์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  .d.ts ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋œ ๋„์›€์ด ๋ ์ง€๋ผ๋„ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ tsconfig.json ๊ธฐ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค์ด๋ผ๊ณ  ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๋‹ค๋ฉด ์ค‘์š”ํ•œ ๊ฒƒ์„ ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :)


๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ์ง€์ ํ–ˆ๋“ฏ์ด 'IntelliSense'๊ฐ€ .ts ํŒŒ์ผ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ '์ •์˜๋กœ ์ด๋™', '์ฐธ์กฐ ์ฐพ๊ธฐ' ๋“ฑ์„ ์š”์ฒญํ•˜๋ฉด ์—ญ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜์—ฌ .d.ts ํŒŒ์ผ์—์„œ ํ•ด๋‹น .ts ํŒŒ์ผ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ€๋ฆฌ.

์ด ๋งคํ•‘์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ™์€ ์ž„๋ฒ ๋””๋“œ ์ฃผ์„ ๋ฌธ์ž์—ด ์‚ฌ์šฉํ•˜์—ฌ //# sourceURL = ../src/foo.ts ์—์„œ .d.ts

    • ๋” ์ •๊ตํ•œ ์†Œ์Šค ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ '๋กค์—…' .d.ts ์—์„œ ์›๋ž˜ .ts ๋‹ค์‹œ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • .js ํŒŒ์ผ์„ ํ™•์ธํ•˜๊ณ  ์†Œ์Šค๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ `.ts

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

@pgonzal @michaelaird https://github.com/spion/typescript-workspace-plugin ์€ ์ด ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์›์€ ์ •์˜๋กœ ์ด๋™ํ•˜๊ณ  multi-tsconfig yarn/lerna/etc ์ž‘์—… ๊ณต๊ฐ„ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค... Rush์™€ ํ•จ๊ป˜ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ด ๋…ธ๋ ฅ์˜ ์ผํ™˜์œผ๋กœ ๋งŒ๋“  ๋˜ ๋‹ค๋ฅธ ๊ฐ„๋‹จํ•œ ๋„๊ตฌ๋Š” wsrun

lerna run ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘์—… ๊ณต๊ฐ„์˜ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

typescript ์ข…์†์„ฑ์€ ์ˆœ์„œ๋Œ€๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋ฏ€๋กœ wsrun์€ package.json ์ข…์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ† ํด๋กœ์ง€ ์ˆœ์„œ๋กœ ํŒจํ‚ค์ง€ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œํ•˜๋Š” ๋™์•ˆ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ ์˜ ๋ณ‘๋ ฌ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‚˜์ค‘์— ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ oao ๋Š” ์›์‚ฌ๋ฅผ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ monorepo ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ตœ๊ทผ์—๋Š” ๋ช…๋ น์˜ 'ํ† ํด๋กœ์ง€' ์ˆœ์„œ์— ๋Œ€ํ•œ ์ง€์›๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ œ์•ˆ(https://github.com/Microsoft/TypeScript/issues/3469#issuecomment-341317069)๊ณผ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ์—๊ฒŒ ์ค‘์š”ํ•œ ๋ชฉํ‘œ์ด๊ธฐ ๋•Œ๋ฌธ์— "๋ฆฌํŒฉํ† ๋ง"์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์—์„œ ์ž์ฃผ ์–ธ๊ธ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์—ฌ๋Ÿฌ TS ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ๋‹จ์ผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ common-library ๋ฐ app1 ๋ฐ app2 ์•ฑ ๋‘ ๊ฐœ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IDE์—์„œ ์ž‘์—…ํ•  ๋•Œ๋Š” ๋‹จ์ผ ํ”„๋กœ์ ํŠธ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ๋ฆฌํŒฉํ† ๋ง์€ ์„ธ ๋ชจ๋“ˆ ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€๋งŒ app1 ๋ฐ app2 ๋„ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๋นŒ๋“œ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ„๋„์˜ ๊ด€์‹ฌ์‚ฌ๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์‚ฌ์‹ค์€ ์šฐ๋ฆฌ ์•ฑ์ด ๋งค์šฐ ์ž‘๊ณ  cd app1 && tsc ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์™„๋ฒฝํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.

TypeScript๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•œ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

monorepo ํ”„๋กœ์ ํŠธ ๊ฐ„ ๋ฆฌํŒฉํ† ๋ง/์ฐธ์กฐ์˜ ๊ฒฝ์šฐ vscode์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์„ค์ •์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋ฃจํŠธ tsconfig:

"compilerOptions": {
   "baseUrl": ".",
   // global types are different per project
   "types": [],
   "paths": {
      "lib": ["packages/lib/src"],
      "xyz1": ["packages/xyz1/src"],
      "xyz2": ["packages/xyz2/src"],
   }
},
"include": ["./stub.ts"], // empty file with export {} to stop vscode complaining about no input files
"exclude": ["node_modules"]

ํŒจํ‚ค์ง€/xyz1/tsconfig.json

{
  "extends": "../../tsconfig",
   "compilerOptions": {
      "types": ["node"],
   },
   "include": ["src/**/*"]
}

ํŒจํ‚ค์ง€/xyz2/tsconfig.json

{
  "extends": "../../tsconfig",
   "compilerOptions": {
      "types": ["webpack-env"]
   },
  "include": ["src/**/*"]
} 

ํŒจํ‚ค์ง€/lib/tsconfig.json

{
   "extends": "../../tsconfig",
    "compilerOptions": { ... },
    "include": ["src/**/*"],
    // special file to load referenced projects when inside in lib package, without it they won't be 
    // visible until you open some file in these projects 
    "files": ["./references.ts"],
}

ํŒจํ‚ค์ง€/lib/tsconfig-build.json

{
   "extends": "./tsconfig",
    // exclude referenced projects when building
   "files": []
}

ํŒจํ‚ค์ง€/lib/references.ts

import "xyz1";
import "xyz2";

export {};

ํŒจํ‚ค์ง€์˜ package.json ์˜ฌ๋ฐ”๋ฅธ main ์†์„ฑ์ด ํ•„์š”ํ•˜๋ฉฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†๋Š” ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ์—๋„ types ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  "main": "src/main.tsx",
  "types": "src/main.tsx",

์ด๋Ÿฐ ์‹์œผ๋กœ lib ํ•ญ๋ชฉ์„ ๋ฆฌํŒฉํ† ๋ง/์ด๋ฆ„ ๋ณ€๊ฒฝํ•˜๋ฉด xyz1 ๋ฐ xyz2 ์ฐธ์กฐ๋„ ๋ฆฌํŒฉํ„ฐ๋ง๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœ์ ํŠธ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅธ ์ „์—ญ/๋Œ€์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Gradle์—์„œ๋Š” ๋‹จ์ˆœํžˆ ์ด๊ฒƒ์„ ํ•ฉ์„ฑ ๋นŒ๋“œ ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ•œ ๊ฐ€์ง€ ํฌ์ธํŠธ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” repo๋ฅผ ๋ณต์ œํ–ˆ๊ณ  ์ž‘์€ ๊ฑฐ๋ž˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค (๋‚˜๋Š” ์†Œ์Šค๋ฅผ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค : angular, ionic, ๋ฌธ์„œ์—์„œ ์–ป์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ธํ„ฐ๋„ท์—์„œ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ์žˆ์„ ๋•Œ ํ‘œํ˜„ ...) ๋‚˜๋Š” ์ •๋ง ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐˆ ๊ธธ์„ ์•Œ๋ ค์ฃผ์„ธ์š”.

๊ฐ์‚ฌ ํ•ด์š”!
TypeScript์˜ ๋ฐ์€ ๋ฏธ๋ž˜.

์‚ฌ๋žŒ๋“ค์ด ์ƒ๋Œ€ ๋ชจ๋“ˆ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‹œ๋„ํ•ด๋ณด๊ณ  ์‹ถ์€ ํ”„๋กœํ† ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/RyanCavanaugh/project-references-demo ์— ๊ธฐ๋ณธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์ž‘๋™ ๋ฐฉ์‹์„ ๋ณด์—ฌ์ฃผ๋Š” ์ƒ˜ํ”Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ์—์„œ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ:

git clone https://github.com/RyanCavanaugh/TypeScript
git checkout pr-lkg
npm install
npm run build
npm link

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ํด๋”์—์„œ:

npm link typescript

pr-lkg ํƒœ๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ตœ์‹  ์ž‘์—… ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ•  ์ผ์— ๋Œ€ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„:

  • [x] ์ข…์† ํ”„๋กœ์ ํŠธ๊ฐ€ ๋นŒ๋“œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋” ๋‚˜์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ถ”๊ฐ€
  • [ ] ๋น„์ƒ๋Œ€ ๋ชจ๋“ˆ ๊ฒฝ๋กœ์— ๋ฆฌ๋””๋ ‰์…˜ ๋™์ž‘ ์ ์šฉ
  • [ ] ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉํ•  API ๋…ธ์ถœ

@RyanCavanaugh del ๋ชจ๋“ˆ ๋˜๋Š” Error: Cannot find module 'C:\github\TypeScript\built\local\tsc.js' (์•„๋งˆ๋„ ๋กœ์ปฌ ๊ฒฝ๋กœ?) ๋ˆ„๋ฝ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์‹ค์ œ๋กœ ๋นŒ๋“œํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ „๋ฐ˜์ ์œผ๋กœ ๊ตฌ์กฐ๊ฐ€ ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ tsc ์ „์šฉ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์–ธ์–ด ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ VSCode์˜ ํ”„๋กœ์ ํŠธ ์ „์ฒด ๋ฆฌํŒฉํ† ๋ง๋„ ์„ค๋ช…ํ•ฉ๋‹ˆ๊นŒ?

...๋˜ํ•œ pr-lkg ํƒœ๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํƒœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๋ถ„๊ธฐ๊ฐ€ ์•„๋‹˜). https://github.com/RyanCavanaugh/TypeScript/tree/pr-lkg ์ฐธ์กฐ

references in tsconfig.json ๋Š” ์ข…์†์„ฑ๋ณ„ ์˜ตํŠธ์ธ์ž…๋‹ˆ๋‹ค. rootDir ์™ธ๋ถ€์—์„œ ํ•ด๊ฒฐ๋˜๋Š” ๋ชจ๋“  ๊ฒƒ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์„๊นŒ์š”?

๋‹ค์Œ๊ณผ ๊ฐ™์€ sandbox ์†์„ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

# tsconfig.json
{
  "compilerOptions": {
    "outDir": "lib",
    "sandbox": "."
  },
  "include": ["src/index.ts"]
}

์ƒŒ๋“œ๋ฐ•์Šค๋Š” rootDir ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. tsconfig.json ๊ฐ€ ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹  ์ผ๋ฐ˜ ๋ชจ๋“ˆ ํ™•์ธ์ด ์ ์šฉ๋˜๋ฉฐ FS ํŠธ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ tsconfig.json ์ž๋™์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# package.json
{
  "name": "animals",
  "module": "src",
  "typings": "lib",
  "dependencies": {
    "core": "*"
  }
}

์ด ๋ฐฉ๋ฒ•:

  • ๋‘ ๊ฐœ์˜ ๋™๊ธฐํ™”๋œ ๋ชฉ๋ก( references ๋ฐ dependencies )์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํŒจํ‚ค์ง€๋Š” ์ž์ฒด ์™ธ๋ถ€์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ง€์‹์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ง€์ • ๊ฒฝ๋กœ ๋Œ€์‹  ๋…ธ๋“œ ๋ชจ๋“ˆ ํ™•์ธ ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@RyanCavanaugh , ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์œผ๋กœ ๋กœ์ปฌ์—์„œ๋งŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด travis-ci.org์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ?

์˜ค๋Š˜ @billti / @mhegazy ์™€์˜ ํšŒ์˜ ๋ฉ”๋ชจ


  • ์ฐธ์กฐ ์ฐพ๊ธฐ/์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋Š” ์ ์–ด๋„ ํ”„๋กœ์ ํŠธ์˜ ์ข…๋ฃŒ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ปดํŒŒ์ผ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์†”๋ฃจ์…˜ ์ „์ฒด ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋Š” "์†”๋ฃจ์…˜" ํŒŒ์ผ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ด๋™ํ•˜๊ณ , ์ฐธ์กฐํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋’ค๋กœ ์ž‘์—…ํ•œ ๋‹ค์Œ, ๊ธฐํ˜ธ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ทธ๋ž˜ํ”„ ์„น์…˜์„ ๊ตฌํ˜„ ๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง„์ •ํ•œ ์›๋ž˜ ์„ ์–ธ์„ ์ฐพ๊ธฐ ์œ„ํ•œ ๋ฐ˜๋ณต์ ์ธ ํ”„๋กœ์„ธ์Šค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • tsbuild๋Š” -w ๋ชจ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์†”๋ฃจ์…˜์—๋Š” ์†”๋ฃจ์…˜ ํด๋” ์™ธ๋ถ€์—์„œ ์‹œ์ž‘๋œ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • gulp, webpack๊ณผ ๊ฐ™์€ ๋ช…ํ™•ํ•œ ๋ฌธ์„œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ด๋“œ๋ฐ”: ์ด ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋Š” ์˜ค๋Š˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

function f() {
  if (Math.random() > 0.5) {
    return { foo: 10 };
  } else {
    return { foo: 20 };
}
// rename foo here doesn't rename *both* instances in the function body
f().foo;

Ryan, Mohamed, Bill์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ์ž‘๋™ํ•˜๋Š” ์ฐธ์กฐ ์ฐพ๊ธฐ/์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์ค‘๊ฐ„ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” TypeScript์— ๋Œ€ํ•œ ์›๋ž˜ ๋ถˆ๋งŒ์„ ์ œ๊ธฐํ•  ๋•Œ ์—ผ๋‘์— ๋‘์—ˆ๋˜ ํ•ต์‹ฌ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ๋Š” ๋ชจ๋“ˆ์‹์ด์ง€๋งŒ ํฌ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์—ฌ๊ธฐ์—์„œ ๋ณธ ์ œ์•ˆ๊ณผ ์ž‘์—…์€ ํ™•์žฅ์„ฑ ํ”Œ๋ ˆ์ด์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ TypeScript์˜ ์žฅ๊ธฐ์ ์ธ ์ƒํƒœ์— ๋งค์šฐ ์ค‘์š”ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ์ค‘๊ฐ„ ๊ทœ๋ชจ๊ฐ€ ์•„๋‹Œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Ryan์˜ ์ด ๋Œ“๊ธ€ ์—์„œ ๋“ค์€ ๋‚ด์šฉ์€ TypeScript์—์„œ ์ค‘๊ฐ„ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์ธ์ฒด ๊ณตํ•™์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‚ฌํ•ญ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด TypeScript ํŒ€ ์ „์ฒด์— ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋‹น์‹ ์€ ๋ฉ‹์ง„ ์ผ์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

lerna/yarn ์ž‘์—… ๊ณต๊ฐ„์—๋Š” ๋‹น์‹ ์˜ ์‚ถ์„ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค„ ํŠธ๋ฆญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์œ„ ํ”„๋กœ์ ํŠธ์˜ package.json์— ์žˆ๋Š” main ๋ฐ types ํ•ญ๋ชฉ์„ src/index๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ts ํŒŒ์ผ ๋ฐ ์ฐธ์กฐ ์ฐพ๊ธฐ/์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹จ์ผ tsc๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ „ํ™”.

๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ๊ณผ ํ•จ์ •์ด ์žˆ์ง€๋งŒ(ํ•œ ํŒจํ‚ค์ง€์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ „์—ญ ๊ธฐํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์„ ์˜ค์—ผ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ) ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
NPM์— ๊ฒŒ์‹œํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ๋ฐ ์œ ํ˜•์„ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(๋นŒ๋“œ์˜ ์ผ๋ถ€๋กœ).

์œ„์˜ ์„ค์ •์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์–ด๋Š ์ •๋„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‹น์‹ ์˜ ์‚ถ์„ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค„ lerna/yarn ์ž‘์—… ๊ณต๊ฐ„์˜ ํŠธ๋ฆญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์œ„ ํ”„๋กœ์ ํŠธ์˜ package.json์— ์žˆ๋Š” ๊ธฐ๋ณธ ํ•ญ๋ชฉ๊ณผ ์œ ํ˜• ํ•ญ๋ชฉ์ด src/index.ts ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜๋ฉด ์ฐธ์กฐ ์ฐพ๊ธฐ/์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ํ•ด๋‹น ์„ค์ •์˜ ๋ฌธ์ œ๋Š” TypeScript๊ฐ€ _external_ ํŒจํ‚ค์ง€์˜ ts ํŒŒ์ผ์„ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ํŒจํ‚ค์ง€์˜ _์†Œ์Šค_์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋Š” _requireing_ ํŒจํ‚ค์ง€์˜ tsconfig๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋ฒˆ ์—ฌ๋Ÿฌ ๋ฒˆ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํŒจํ‚ค์ง€์— ๋‹ค๋ฅธ tsconfig(์˜ˆ: ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ๋•Œ๊นŒ์ง€ ํ•„์ˆ˜ ํŒจํ‚ค์ง€์— ์ž˜๋ชป๋œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋˜ํ•œ ํ•„์ˆ˜ ํŒจํ‚ค์ง€๋Š” ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋Š๋ฆฌ๊ฒŒ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ํŒจํ‚ค์ง€์˜ rootDir ๋Š” ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋˜์–ด ์ž ์žฌ์ ์œผ๋กœ index ํฌํ•จํ•˜๋Š” ๋Œ€์‹  ๋ชจ๋“  ํŒจํ‚ค์ง€์˜ TS ํŒŒ์ผ์„ ์ง์ ‘ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฃผ์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํ•„์ˆ˜ ํŒจํ‚ค์ง€ API๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ•๋ ฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€์— ์™ธ๋ถ€์— ์žˆ์–ด์•ผ ํ•˜๋Š” ํ•„์ˆ˜ ํŒจํ‚ค์ง€์˜ ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋‹จ์  ๋•Œ๋ฌธ์— TS ํŒŒ์ผ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒจํ‚ค์ง€ ๊ฐ„ ์ข…์†์„ฑ์€ index.d.ts ํŒŒ์ผ์— ์žˆ์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฅผ ์™ธ๋ถ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ชจ๋‘ ์–‘ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  .d.ts ์— ๋”ฐ๋ผ ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•œ ๋ฌธ์ œ(webpack๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋กœ ์ฆ‰์‹œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ)์™€ IDE ๊ฒฝํ—˜์ด ์ข‹์ง€ ์•Š์€ ๋ฌธ์ œ(์ด๋ฆ„ ๋ณ€๊ฒฝ, ํŒจํ‚ค์ง€ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์ง€ ์•Š๋Š” ์ฐธ์กฐ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ).

๋‹ค๋ฅธ ๊ฐ์ •์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. typescript๋Š” ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด C#์—๋Š” Roslyn์ด๋ผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์™€ MSBuild๋ผ๋Š” ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ @mhegazy ์™€ ํ•จ๊ป˜ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์ž‘์—…์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ๊ณ ํ†ต์œผ๋กœ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ์— ๋Œ€ํ•œ ๋น„ํ‡ดํ™” ์ตœ์•…์˜ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// alpha.ts
const v = { a: 1 };
export function f() { return v; }
export function g() { return v; }

// alpha.d.ts (generated)
export function f(): { a: number };
export function g(): { a: number };

// beta.ts (in another project)
import { f } from '../etc/alpha';
f().a;

// gamma.ts (in yet another project)
import { g } from '../etc/alpha';
g().a;

ํ•ต์‹ฌ ๊ด€์ฐฐ์€ alpha.ts ๋ฅผ ์ƒํ˜ธ ์—ฐ๊ด€์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†๋‹ค๋ฉด f().a ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด g().a ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๊ณ„ํš์˜ ๋Œ€๋žต์ ์ธ ์Šค์ผ€์น˜:

  • .d.ts ํŒŒ์ผ์˜ "ํ’๋ถ€ํ•œ" ๋ฐ "๋ฆฐ" ๋ฉ”๋ชจ๋ฆฌ ๋‚ด SourceFile ํ‘œํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. "๋ฆฐ" ํŒŒ์ผ์€ ๋””์Šคํฌ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. "ํ’๋ถ€ํ•œ" ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด .d.ts ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • "Rich" .d.ts SourceFiles์—๋Š” ์‹๋ณ„์ž ๋…ธ๋“œ์—์„œ ์›๋ณธ ์†Œ์Šค ํŒŒ์ผ์˜ ์›๋ž˜ ์ด๋ฆ„์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๋™์•ˆ ํ‰์†Œ์™€ ๊ฐ™์ด ๋จผ์ € ๋ฌธ์ œ์˜ ๊ธฐํ˜ธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ .d.ts์—์„œ ์‹œ์ž‘๋˜๋ฉด ๊ตฌํ˜„ ๋กœ๋“œํ•˜๊ณ  "Rich" .d.ts ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    • ์ฐธ๊ณ : ์ด ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐ˜๋ณต์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ ๊ตฌํ˜„ ํŒŒ์ผ(ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋กœ ์ธํ•ด .d.ts ๋ฆฌ๋””๋ ‰์…˜์ด ์•„๋‹Œ ํŒŒ์ผ)์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์—ฌ๋Ÿฌ ์ˆ˜์ค€์„ ๋‹ค์‹œ ์ถ”์ ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด์ œ "ํ’๋ถ€ํ•œ" ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ .d.ts์— ์žˆ๋Š” ๋‹ค๋ฅธ ์‹๋ณ„์ž๊ฐ€ ๋™์ผํ•œ ์†Œ์Šค ํŒŒ์ผ ์‹๋ณ„์ž์—์„œ ์œ ๋ž˜ํ–ˆ๋Š”์ง€ ์•Œ์•„๋ƒ…๋‹ˆ๋‹ค.
  • ๊ฐ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ์—์„œ ํ…์ŠคํŠธ ์Šค์บ” ์ด๋ฆ„์ด ๋ฐ”๋€ ์‹๋ณ„์žํ•˜๊ณ  ์žˆ๋Š”์ง€์˜ "์ด๋™ - ํˆฌ ๋ฐํ”„"๊ฒฐ๊ณผ๊ฐ€ .d.ts์—์„œ "๋™์ผํ•œ ์‹ฌ๋ณผ์—์„œ ์‹œ์ž‘"์œ„์น˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค
  • ๊ตฌํ˜„ ํŒŒ์ผ์—์„œ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์ˆ˜ํ–‰

@RyanCavanaugh ๋Š” ์ •์˜๋กœ ์ด๋™ํ•˜์—ฌ ๋ชจ๋“  ์ฐธ์กฐ๊ฐ€ ์ด ๋ชจ๋ธ์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ˆ˜๋งŽ์€ ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์— ๋Œ€ํ•ด Anders ๋ฐ Mohamed์™€์˜ ์ด์ „ ํ† ๋ก ์—์„œ ๋‚˜์˜จ ๋ฉ”๋ชจ

  • prepend ๋Š” .d.ts ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๊นŒ? ์˜ˆ
  • dogfood ์ง€์ ์—์„œ @internal ๋กœ ๋ฌด์—‡์„ ํ•˜๋‚˜์š”? ๋กœ์ปฌ .d.ts ํŒŒ์ผ์— ๋‚ด๋ถ€ ์„ ์–ธ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ถœ๋ ฅ ๋ฒ„์ „์—๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • --stripInternal ์ œ๊ฑฐ

    • ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ๋น„ํ•˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค (์•„์ง ...?)

    • Ryan, remove-internal ๋„๊ตฌ ์ž‘์„ฑ(์™„๋ฃŒ)

    • ๋‚ด์žฅ -> LKG ํ”„๋กœ์„ธ์Šค๊ฐ€ @internal ์„ ์–ธ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด @types ์—์„œ .d.ts ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

    • ๊ฐ€๋Šฅํ•œ ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๋ฅผ ๋ณด๋ ค๋ฉด ์ˆ˜๋™์œผ๋กœ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. โ˜น๏ธ

    • ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ์ถœ๋ ฅ ํด๋”์— "files I look at.txt" ํŒŒ์ผ์„ ๊ฒฐ๊ตญ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • noEmitOnError ํ•„์ˆ˜์ธ๊ฐ€์š”? ์˜ˆ.

    • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค!

  • referenceTarget -> composable โœจ ๐Ÿšฒ ๐Ÿก โœจ
  • ์„ ์–ธ ๋ฐฉ์ถœ์„ ์›ํ•˜์ง€ ์•Š์ง€๋งŒ ๋น ๋ฅธ ์žฌ๊ตฌ์ถ•์„ ์›ํ•˜๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ ํ”„๋กœ์ ํŠธ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

    • tsbuild ๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ํ•ญ๋ชฉ์€ composable ์˜ ์—…์ŠคํŠธ๋ฆผ๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ˆœํ™˜ ์ฐธ์กฐ, (์–ด๋–ป๊ฒŒ) ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

    • ๊ธฐ๋ณธ์ ์œผ๋กœ

    • ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด { path: "../blah", circular: true } ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋นŒ๋“œ๊ฐ€ ๊ฒฐ์ •์ ์ด๊ณ  ํ•ญ์ƒ ๊ณ ์ •๋œ ์ง€์ ์— ๋„๋‹ฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค(์•„๋งˆ๋„ ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค?!)

    • ์ˆœํ™˜:true ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ์žฌ๋งคํ•‘์€ ์„ ํƒ ์‚ฌํ•ญ ์ด์ง€๋งŒ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ง€์ •๋œ ์žฌ๋งคํ•‘์ž…๋‹ˆ๋‹ค.

์žก๋ก

  • @weswigham ์—๋Š” @mhegazy ์™€ ๋…ผ์˜ํ•ด์•ผ ํ•˜๋Š” ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ์— ๋Œ€ํ•œ ๋Œ€์ฒด ์•„์ด๋””์–ด๊ฐ€

๋‚˜๋Š” ์ด๋ฏธ ์กŒ๋‹ค. ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์†Œ์Šค๋งต์˜ ํ•ด์„์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ(๋ณ„๋„ ๋„๊ตฌ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ฑ…์ž„) ๋‹น์‹ ์ด ์—†๋Š” ๋™์•ˆ ์–ด์จŒ๋“  ์ถ”๊ฐ€ ์ž‘์—…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค(๋ถ„๋ช…ํžˆ ์›ํ™œํ•œ go-to def๊ฐ€ ๋ฐ”๋žŒ์งํ•˜๊ธฐ ๋•Œ๋ฌธ์—).

@RyanCavanaugh
#23944 ๋ณ‘ํ•ฉ ํ›„ ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“  ์ฐธ์กฐ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ ์–ธ์–ด ์„œ๋น„์Šค(tsbuild๋Š” ์ œ์™ธ)๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ composite: true ๋ฐ projectReferences: [] ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

#23944 ๋ณ‘ํ•ฉ ํ›„ ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“  ์ฐธ์กฐ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์•„์ง ์•„๋‹˜. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์— ์ด๊ฒƒ์„ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์–ธ์–ด ์„œ๋น„์Šค(tsbuild๊ฐ€ ์•„๋‹˜)๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋ณตํ•ฉ: true ๋ฐ projectReferences: []๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์งˆ๋ฌธ์„ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "๋นŒ๋“œ"๊ฐ€ ์•„๋‹Œ "์–ธ์–ด ์„œ๋น„์Šค"๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์งˆ๋ฌธ์„ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "๋นŒ๋“œ"๊ฐ€ ์•„๋‹Œ "์–ธ์–ด ์„œ๋น„์Šค"๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด ๋นŒ๋“œ ๋„๊ตฌ( build mode ๋ผ๊ณ ๋„ ํ•จ)(#22997)๊ฐ€ ์•„๋‹ˆ๋ผ monorepo์˜ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ํŽธ์ง‘๊ธฐ ์ง€์›(์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ/๋ชจ๋“  ์ฐธ์กฐ ์ฐพ๊ธฐ/๋“ฑ...)์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ปดํŒŒ์ผ์— ๋Œ€ํ•œ babel.

๊ทธ๋ƒฅ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. build๋Š” ์˜ตํŠธ์ธ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด VSCode์—์„œ ์–ธ์–ด ์„œ๋น„์Šค ๊ฒฝํ—˜์— tsc ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ต์ฐจ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์„ ์–ธ ๋ฐ ์„ ์–ธ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ๋Œ€์‹ :

"dependencies": [
    "../common", 
    "../util"
],

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

"dependencies": [
    "common", 
    "util"
],

์ž‘์—… ๊ณต๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. tsconfig.json

"workspace": {
  "common": "packages/common",
  "util": "packages/util"
}

๋˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์€ ๊ฒฝ๋กœ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

"workspace": {
  "*":"packages/*"
}

ํ˜œํƒ:

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

์•„๋‹ˆ๋ฉด ์ตœ์†Œํ•œ ๋ฏธ๋ž˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋น„๊ฒฝ๋กœ ์ด๋ฆ„('./' ๋˜๋Š” '../'๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„)์„ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์ž‘์—… ๊ณต๊ฐ„๊ณผ @RyanCavanaugh ๊ฐ€ TypeScript ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ/๋นŒ๋“œ ๋ชจ๋“œ์™€ ๊ด€๋ จํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ์ง๊ฐ์œผ๋กœ๋Š” Yarn ์ž‘์—… ๊ณต๊ฐ„(์˜ฌํ•ด npm์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ)๊ณผ ํ–ฅํ›„ TypeScript ๋ฒ„์ „ ์‚ฌ์ด์˜ _somewhere_๊ฐ€ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ ๋ฐ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋‹จ์ผ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ข‹์€ ์ง€์›์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ๊ณ ํ†ต์„ ๋Š๋‚€๋‹ค.)

์ด ๊ธฐ๋Šฅ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ๋‹ฌ ์ •๋„์— Aurelia vNext๋ฅผ ๋ชจ๋…ธ๋ ˆํฌ๋กœ ์˜ฎ๊ธธ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ƒˆ ๋ฒ„์ „์€ 100% TypeScript์ด๋ฉฐ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด Lerna๋ณด๋‹ค ๊ณต์‹ TS ํ”„๋กœ์ ํŠธ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์˜ ์–ผ๋ฆฌ ์–ด๋‹ตํ„ฐ/ํ…Œ์Šคํ„ฐ๋ฅผ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

์†Œ์Šค ๋งต ์ง€์›์„ ํ•ต์‹ฌ ์ง€์› ๋ฐ goto def ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ฆด๋ฆฌ์Šค(TS 2.9)์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์ง€์›์„ ์œ„ํ•œ tsc --b ๋Š” ์ด๋ฏธ TS 3.0์— ์žˆ์œผ๋ฉฐ ์ด์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. typescript ์ฝ”๋“œ ๋ฒ ์ด์Šค๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์˜ฎ๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค . ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ typescript repo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ง€์›์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 1. ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ฐธ์กฐ ์ฐพ๊ธฐ/์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. 2. ํŽธ์ง‘๊ธฐ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ .d.ts ํŒŒ์ผ ์—…๋ฐ์ดํŠธ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ 3. ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ --watch ์ง€์›. ๋˜ํ•œ ๋งŽ์€ ํ…Œ์ŠคํŠธ.

์ด ํ‹ฐ์ผ“์€ ๊ทธ๊ฐ€ 3๋…„ ๋™์•ˆ ์˜ˆ์•ฝํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ง 3/6 ๋ฏธํ•ด๊ฒฐ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@claudeduguay ์ด๊ฒƒ์€ TypeScript๊ฐ€ ์ง€์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค. ์ถ•ํ•˜ํ•  ์‹œ๊ฐ„์ด ์•„๋‹ˆ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค!

@mhegazy ์ด๊ฒƒ์€ ์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค. TS ํŒ€์ด ์ž์ฒด ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ด๋ฅผ ๋„๊ทธํ‘ธ๋”ฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์†Œ์‹์„ ๋“ค์œผ๋‹ˆ ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ณ  ์ด๊ฒƒ์„ Aurelia์˜ ์˜ต์…˜์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. :) ์„ค์ •์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ๋‚˜์˜ค๋Š” ์ฆ‰์‹œ vNext๋ฅผ ์ƒˆ ํ”„๋กœ์ ํŠธ ์‹œ์Šคํ…œ์œผ๋กœ ์ด๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์–ด!

@mhegazy ์ด ๋ชจ๋“  ๊ฒƒ์ด ES2015 ๋ชจ๋“ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” package.json ํŒŒ์ผ ๋ฐ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด Aurelia vNext์—๋Š” @aurelia/kernel , @aurelia/runtime , @aurelia/jit ๋“ฑ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. import ์—์„œ ์‚ฌ์šฉํ•  ๋ชจ๋“ˆ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์— ๊ฑธ์นœ ์ง„์ˆ . TS ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ ์ด๋ฆ„์ด ๋‹ค์–‘ํ•œ ์ฐธ์กฐ ํด๋”์— ๋งคํ•‘๋œ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•ฉ๋‹ˆ๊นŒ? ์ฐธ์กฐ๋œ ๊ฐ ํด๋”์— ์žˆ๋Š” package.json ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๊นŒ? Lerna ๋˜๋Š” Yarn Workspace์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๊นŒ? ์œ„์˜ ๋งํฌ๋ฅผ ์ฒ˜์Œ ์‚ดํŽด๋ณด๋ฉด ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์–ป๊ธฐ ์œ„ํ•ด TS ํ”„๋กœ์ ํŠธ(๋นŒ๋“œ)๋ฅผ Lerna(dep linking and Publishing)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ TS๊ฐ€ ์–ด๋–ป๊ฒŒ ์ œ๋Œ€๋กœ ๋นŒ๋“œ๋˜๋Š”์ง€๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. package.json ๋ฐ node_modules์™€ ํ†ตํ•ฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ. TS repo ์†Œ์Šค๋Š” ์ผ๋ฐ˜์ ์ธ Lerna ํ”„๋กœ์ ํŠธ์™€ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—(์‹ค์ œ๋กœ๋Š” ์ „ํ˜€ ๊ทธ๋ ‡์ง€ ์•Š์Œ) ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ถ๊ธˆํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ์ •๋ณด, ํŠนํžˆ. ์—ฌ๊ธฐ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์ž‘๋™ํ•˜๋Š” ๋ฐ๋ชจ ์†”๋ฃจ์…˜ ์„ค์ •์ด ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

@EisenbergEffect์™€ ๊ฐ™์€ ์งˆ๋ฌธ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋‚˜๋Š” ์ด๊ฒƒ์ด lerna ๊ด€๋ฆฌ๋˜๋Š” monorepo์™€ ์ž˜ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ๋‘ ๊ฐ€์ง€ ๋‹จ์ผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์‹œ๋‚˜๋ฆฌ์˜ค

lerna๋กœ ๋ชจ๋“  ๊ฒƒ์„ ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•œ ์„ค์ •๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

/packages
  /a
    /node_modules
      /b -> symlink to b with package.json "types" pointing to dist/index.d.ts
  /b
    /dist
      /index.d.ts -> built output of entry point declaration file

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ•ต์‹ฌ์€ a a ๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒฝ์šฐ a ๋ฅผ ๋นŒ๋“œํ•œ b ๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ถ”๊ฐ€ ํ•  ๊ฒƒ "references": [ { "path": "../b" } ] ์— a ์˜ tsconfig.json ์‹คํ–‰ tsc --build ์—์„œ a ์˜ฌ๋ฐ”๋ฅธ ์ƒ๋ฅ˜ ๋นŒ๋“œ ์–ป์„ b . ์ด ์„ธ๊ณ„์—์„œ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋Š” ๋‹จ์ˆœํžˆ ๋นŒ๋“œ ๊ทธ๋ž˜ํ”„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ ๋” ์Šค๋งˆํŠธํ•œ ์ฆ๋ถ„ ์žฌ๊ตฌ์ถ•์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ lerna์™€ TS๋Š” ์—ฌ๊ธฐ์—์„œ ํ˜‘๋ ฅํ•˜๊ณ  ์ ์ ˆํ•œ ๊ฒฝ์šฐ package.json ์ข…์†์„ฑ์„ tsconfig.json ๋กœ ๋ฏธ๋Ÿฌ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

{
  "compilerOptions": { "outDir": "bin" },
  "package": "@RyanCavanaugh/coolstuff"
}

"references": [{ "path": "../cool" }] ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด @RyanCavanaugh/coolstuff -> ../cool/bin/ ์˜ ๊ฒฝ๋กœ ๋งคํ•‘์ด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์•„์ง ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋” ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ํŒ๋ช…๋˜๋ฉด ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ lerna์™€ TS๋Š” ์—ฌ๊ธฐ์—์„œ ํ˜‘๋ ฅํ•˜๊ณ  ์ ์ ˆํ•œ ๊ฒฝ์šฐ package.json ์ข…์†์„ฑ์„ tsconfig.json์œผ๋กœ ๋ฏธ๋Ÿฌ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ๋„๊ตฌ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  composite: true ๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ package.json (tsconfig์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ)๋ฅผ ์ž ์žฌ์  ์ฐธ์กฐ๋กœ ์ฝ๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ฐ ํ•ด๊ฒฐ๋œ ํŒจํ‚ค์ง€์— tsconfig.json , ํ•˜๋‚˜๊ฐ€ ์žˆ์œผ๋ฉด ๋นŒ๋“œ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋ฐ˜๋ณต). ๋ชจ๋“  ๊ฒƒ์ด ์ œ์ž๋ฆฌ์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ž‘์—… ๊ณต๊ฐ„์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์ƒ๋„๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. Lerna๋Š” ์‹ค์ œ๋กœ afaik์ฒ˜๋Ÿผ ts ๊ด€๋ จ(๋˜๋Š” ๋นŒ๋“œ ๊ด€๋ จ) ํ•ญ๋ชฉ์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ์ œ์ž๋ฆฌ์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•˜๊ณ  ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ts ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  (์„ ์–ธ๋ณด๋‹ค ํŒŒ์ผ์„ ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์—) ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ์ผ์— ๋Œ€ํ•œ ์ตœ์ ํ™”๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ ๊ตฌ์‹ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ๊ฒƒ์„ ์žฌ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

@RyanCavanaugh ์ด๊ฒƒ์€ ๊ฝค ํฅ๋ฏธ๋กญ๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. Rush์˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์ „๋žต๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ Rush๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์„ ํฌํ•จํ•˜๋Š” ํ•ฉ์„ฑ ํŒจํ‚ค์ง€ common/temp/package.json ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ pnpm ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํ•ฉ์„ฑ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋‹จ์ผ ์„ค์น˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (PNPM์€ ์ค‘๋ณต๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋Š” NPM์˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ ๋Œ€์‹  ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.) ๊ทธ๋Ÿฐ ๋‹ค์Œ Rush๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๊ฐ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด common/temp ์•„๋ž˜์˜ ์ ์ ˆํ•œ ํด๋”๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” TypeScript ๋ฐ ํ‘œ์ค€ NodeJS ํ•ด์ƒ๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ์ˆ˜์ถ• ํฌ์žฅ ํŒŒ์ผ๊ณผ ํ•˜๋‚˜์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐฉ์ •์‹์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋น ๋ฅด๋ฉฐ ๊ฐ ํŒจํ‚ค์ง€๊ฐ€ ๊ณ ์œ ํ•œ ์ข…์†์„ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ๋ชจ๋ธ์— ๋Œ€ํ•ด tsconfig.json ์— ํŠน๋ณ„ํ•œ ๊ฒƒ์„ ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. goto-definition ๊ธฐ๋Šฅ์— ํŠน๋ณ„ํ•œ TypeScript ๊ตฌ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Git์— ์ €์žฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ค์น˜ ์ค‘์— ์ž๋™ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

@pgonzal Rush์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์•„์ง ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ์˜ค๋Š˜ ๋ฐค์— ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. lerna๋ฅผ ์‚ฌ์šฉํ•œ ์ฒซ ๋ฒˆ์งธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ๊ณผ ๊ฐ€์žฅ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ https://github.com/aurelia/ux ์—์„œ ์ƒˆ ํ”„๋กœ์ ํŠธ ์ง€์›์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” TS ๋ฐ lerna๊ฐ€ ํฌํ•จ๋œ UX ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.

@weswigham ๋‹น์‹ ์ด ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ ์‹œ๋‚˜๋ฆฌ์˜ค์—๋„ ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ.

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

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ ('./' ๋˜๋Š” '../')์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ์ฐธ์กฐ๋ฅผ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋Œ€์‹  ํ™œ์„ฑ ๋ชจ๋“ˆ ํ™•์ธ ์ „๋žต์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋˜๋Š” "๋ช…๋ช…๋œ ์ฐธ์กฐ"๊ฐ€ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@spion ํ•„์š”ํ•œ ๊ฒฝ์šฐ path ์ด์™ธ์˜ ์†์„ฑ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: "references": [ { "module": "@foo/baz" } ] ). "bar" ๋ฐ "./bar" ๊ฐ€ files ์—์„œ๋Š” ๋™์ผํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋งŒ references ์—์„œ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ํ˜ผ๋™์„ ์ผ์œผํ‚ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค "./bar"

์•„๋ž˜์—์„œ ๋ฌธ์„œ/๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ์ž‘์—… ์ง„ํ–‰ ์ค‘(ํ”ผ๋“œ๋ฐฑ์— ๋”ฐ๋ผ ์ˆ˜์ • ์˜ˆ์ •)

์ด ์Šค๋ ˆ๋“œ๋ฅผ ํŒ”๋กœ์šฐํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ์‹œ๋„ํ•ด ๋ณผ ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ํ˜„์žฌ ๋ชจ๋…ธ๋ ˆํฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋งˆ์ง€๋ง‰ ๋ฒ„๊ทธ/๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ณง ์ด์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋Š” TypeScript ํ”„๋กœ๊ทธ๋žจ์„ ๋” ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” TypeScript 3.0์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

๋˜ํ•œ ๋” ๋น ๋ฅธ TypeScript ๋นŒ๋“œ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” tsc , --build ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ชจ๋“œ๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ํ”„๋กœ์ ํŠธ

์ƒ๋‹นํžˆ ์ •์ƒ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ดํŽด๋ณด๊ณ  ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๋” ์ž˜ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€ ๋ด…์‹œ๋‹ค.
converter ๋ฐ units ๋‘ ๊ฐœ์˜ ๋ชจ๋“ˆ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์™€ ๊ฐ๊ฐ์— ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

/src/converter.ts
/src/units.ts
/test/converter-tests.ts
/test/units-tests.ts
/tsconfig.json

ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ ๊ตฌํ˜„ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

// converter-tests.ts
import * as converter from "../converter";

assert.areEqual(converter.celsiusToFahrenheit(0), 32);

์ด์ „์—๋Š” ๋‹จ์ผ tsconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ์–ด์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์—ฌ๋Ÿฌ tsconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€ ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

  • ๋‚ด์žฅ๋œ ์ตœ์‹  ํ™•์ธ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ ๊ฒฐ๊ตญ tsc ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • tsc ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ๋” ๋งŽ์€ ์‹œ์ž‘ ์‹œ๊ฐ„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • tsc -w ๋Š” ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฌธ์ œ ๋“ฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

tsconfig.json ํŒŒ์ผ์—๋Š” ์ƒˆ๋กœ์šด ์ตœ์ƒ์œ„ ์†์„ฑ references ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐํ•  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

{
    "compilerOptions": {
        // The usual
    },
    "references": [
        { "path": "../src" }
    ]
}

๊ฐ ์ฐธ์กฐ์˜ path ์†์„ฑ์€ tsconfig.json ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ ์ž์ฒด(์ด๋ฆ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ)๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋Œ€์‹  ์ถœ๋ ฅ ์„ ์–ธ ํŒŒ์ผ( .d.ts )์ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
  • ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ๊ฐ€ outFile ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ถœ๋ ฅ ํŒŒ์ผ .d.ts ํŒŒ์ผ์˜ ์„ ์–ธ์ด ์ด ํ”„๋กœ์ ํŠธ์—์„œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ๋นŒ๋“œ ๋ชจ๋“œ(์•„๋ž˜ ์ฐธ์กฐ)๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

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

composite

์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์—๋Š” ์ƒˆ composite ์„ค์ •์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ์„ค์ •์€ TypeScript๊ฐ€ ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์„ ์ฐพ์„ ์œ„์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
composite ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

  • rootDir ์„ค์ •์€ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ tsconfig ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ตฌํ˜„ ํŒŒ์ผ์€ include ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๊ฑฐ๋‚˜ files ๋ฐฐ์—ด์— ๋‚˜์—ด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜๋ฉด tsc ์ง€์ •๋˜์ง€ ์•Š์€ ํŒŒ์ผ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • declaration ๊ฐ€ ์ผœ์ ธ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

declarationMaps

์„ ์–ธ ์†Œ์Šค ๋งต์— ๋Œ€ํ•œ ์ง€์›๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
--declarationMap ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด "์ •์˜๋กœ ์ด๋™" ๋ฐ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ์™€ ๊ฐ™์€ ํŽธ์ง‘๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์›๋˜๋Š” ํŽธ์ง‘๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ์ฝ”๋“œ๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ํƒ์ƒ‰ํ•˜๊ณ  ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

prepend outFile

์ฐธ์กฐ์—์„œ prepend ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ์˜ ์ถœ๋ ฅ์„ ์•ž์— ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

   "references": [
       { "path": "../utils", "prepend": true }
   ]

ํ”„๋กœ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ ์œ„์— ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ .js ํŒŒ์ผ๊ณผ .d.ts ํŒŒ์ผ ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ์†Œ์Šค ๋งต ํŒŒ์ผ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.

tsc ๋Š” ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋””์Šคํฌ์˜ ๊ธฐ์กด ํŒŒ์ผ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์ด ๊ฒฐ๊ณผ ํŒŒ์ผ์— ๋‘ ๋ฒˆ ์ด์ƒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅธ ์ถœ๋ ฅ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .
์˜ˆ๋ฅผ ๋“ค์–ด:

  ^ ^ 
 /   \
B     C
 ^   ^
  \ /
   D

์ด ์ƒํ™ฉ์—์„œ๋Š” D ์˜ ์ถœ๋ ฅ์— A ์˜ ๋‘ ๋ณต์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๊ฐ ์ฐธ์กฐ ์•ž์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์— ๋Œ€ํ•œ ์ฃผ์˜ ์‚ฌํ•ญ

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์—๋Š” ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ ˆ์ถฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ข…์† ํ”„๋กœ์ ํŠธ๋Š” ์ข…์†์„ฑ์—์„œ ๋นŒ๋“œ๋œ .d.ts ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ๋นŒ๋“œ ์ถœ๋ ฅ์„ ์ฒดํฌ์ธ ํ•˜๊ฑฐ๋‚˜ ๋ณต์ œํ•œ ํ›„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ด์•ผ ๊ฐ€์งœ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ํŽธ์ง‘๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜.
์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” .d.ts ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค ๋’ค์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ณต์ œ ํ›„ ๋นŒ๋“œํ•ด์•ผ ํ•จ์„ ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ์กด ๋นŒ๋“œ ์›Œํฌํ”Œ๋กœ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด --build ์Šค์œ„์น˜๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ํ•œ tsc ๋Š” ์ข…์†์„ฑ์„ ์ž๋™์œผ๋กœ ๋นŒ๋“œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .
--build ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

TypeScript์šฉ ๋นŒ๋“œ ๋ชจ๋“œ

์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์˜จ ๊ธฐ๋Šฅ์€ TypeScript ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์Šค๋งˆํŠธ ์ฆ๋ถ„ ๋นŒ๋“œ์ž…๋‹ˆ๋‹ค.
3.0์—์„œ๋Š” tsc ์™€ ํ•จ๊ป˜ --build ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‹จ์ˆœํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋ณด๋‹ค ๋นŒ๋“œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” tsc ์˜ ์ƒˆ๋กœ์šด ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค.

tsc --build (์ค„์—ฌ์„œ tsc -b )๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • ์ฐธ์กฐ๋œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ์ฐพ๊ธฐ
  • ์ตœ์‹  ์ƒํƒœ์ธ์ง€ ๊ฐ์ง€
  • ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์˜ค๋ž˜๋œ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ

tsc -b ์— ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: tsc -b src test ).
๊ทธ๋ƒฅ ๊ฐ™์€ tsc -p ์ด ์ด๋ฆ„ ์•Š๋‹ค๋ฉด ์ž์ฒด๊ฐ€ ๋ถˆํ•„์š” ์„ค์ • ํŒŒ์ผ ์ด๋ฆ„ ์ง€์ •, tsconfig.json .

tsc -b ๋ช…๋ น์ค„

์›ํ•˜๋Š” ์ˆ˜์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 > tsc -b                                # Build the tsconfig.json in the current directory
 > tsc -b src                            # Build src/tsconfig.json
 > tsc -b foo/release.tsconfig.json bar  # Build foo/release.tsconfig.json and bar/tsconfig.json

๋ช…๋ น์ค„์—์„œ ์ „๋‹ฌํ•˜๋Š” ํŒŒ์ผ ์ˆœ์„œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. tsc ๋Š” ์ข…์†์„ฑ์ด ํ•ญ์ƒ ๋จผ์ € ๋นŒ๋“œ๋˜๋„๋ก ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํŒŒ์ผ์„ ์žฌ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

tsc -b ๊ด€๋ จ ํ”Œ๋ž˜๊ทธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • --verbose : ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ž์„ธํ•œ ๋กœ๊น…์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ์™€ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ์Œ)
  • --dry : ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ํ‘œ์‹œํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋นŒ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • --clean : ์ง€์ •๋œ ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค( --dry ์™€ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ).
  • --force : ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™
  • --watch : ๊ฐ์‹œ ๋ชจ๋“œ( --verbose ์ œ์™ธํ•œ ํ”Œ๋ž˜๊ทธ์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์—†์Œ)

์ฃผ์˜ ์‚ฌํ•ญ

๋ณดํ†ต tsc ์ถœ๋ ฅ (์ƒ์‚ฐํ•  ์˜ˆ์ • .js ๋ฐ .d.ts ์•Š๋Š”) ๊ตฌ๋ฌธ ๋˜๋Š” ์ž…๋ ฅ ์—๋Ÿฌ์˜ ์กด์žฌ๋ฅผ noEmitOnError ์—์žˆ๋‹ค.
์ฆ๋ถ„ ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋‚˜์ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜์— ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ›„์† ๋นŒ๋“œ๊ฐ€ ํ˜„์žฌ ์ตœ์‹  ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ด์œ ๋กœ tsc -b noEmitOnError ๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด

๋นŒ๋“œ ์ถœ๋ ฅ( .js , .d.ts , .d.ts.map ๋“ฑ)์„ ์ฒดํฌ์ธํ•˜๋Š” ๊ฒฝ์šฐ ํŠน์ • ์†Œ์Šค ์ œ์–ด ํ›„์— --force ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ œ์–ด ๋„๊ตฌ๊ฐ€ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ๊ณผ ์›๊ฒฉ ๋ณต์‚ฌ๋ณธ ์‚ฌ์ด์˜ ํƒ€์ž„์ŠคํŠธ๋งต์„ ์œ ์ง€ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ž‘์—…์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

msbuild

msbuild ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋นŒ๋“œ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    <TypeScriptBuildMode>true</TypeScriptBuildMode>

๋‹น์‹ ์˜ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์—. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž๋™ ์ฆ๋ถ„ ๋นŒ๋“œ ๋ฐ ์ •๋ฆฌ๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

tsconfig.json / -p ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ์กด TypeScript ํ”„๋กœ์ ํŠธ ์†์„ฑ์€ ์กด์ค‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ค์ •์€ tsconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ํŒ€์€ tsconfig ํŒŒ์ผ์ด ์ง์„ ์ด๋ฃจ๋Š” ๊ด€๋ฆฌ๋˜๋Š” ํ”„๋กœ์ ํŠธ์™€ ๋™์ผํ•œ ์•”์‹œ์  ๊ทธ๋ž˜ํ”„ ์ˆœ์„œ๋ฅผ ๊ฐ–๋Š” msbuild ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
์†”๋ฃจ์…˜์ด ์ด์™€ ๊ฐ™์œผ๋ฉด ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์™€ ํ•จ๊ป˜ tsc -p ์™€ ํ•จ๊ป˜ msbuild ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์™„์ „ํžˆ ์ƒํ˜ธ ์šด์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋‚ด

์ „์ฒด ๊ตฌ์กฐ

tsconfig.json ํŒŒ์ผ์ด ๋” ๋งŽ์œผ๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ ์ƒ์† ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•  ํ•„์š” ์—†์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๋ฆฌํ”„ ๋…ธ๋“œ ํ”„๋กœ์ ํŠธ์— references ๊ฐ€ ์žˆ๋Š” "์†”๋ฃจ์…˜" tsconfig.json ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ์ง„์ž…์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด TypeScript ์ €์žฅ์†Œ์—์„œ src/tsconfig.json ์— ๋ชจ๋“  ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‚˜์—ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด tsc -b src ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
3.0๋ถ€ํ„ฐ๋Š” tsconfig.json ํŒŒ์ผ์— reference ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ files ๋ฐฐ์—ด์ด ๋น„์–ด ์žˆ๋Š” ๊ฒƒ์ด ๋” ์ด์ƒ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

TypeScript ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. src/tsconfig_base.json , src/tsconfig.json ๋ฐ src/tsc/tsconfig.json ๋ฅผ ์ฃผ์š” ์˜ˆ๋กœ ์ฐธ์กฐํ•˜์„ธ์š”.

์ƒ๋Œ€ ๋ชจ๋“ˆ์„ ์œ„ํ•œ ๊ตฌ์กฐํ™”

์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๋Œ€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ repo๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ฃผ์–ด์ง„ ์ƒ์œ„ ํด๋”์˜ ๊ฐ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— tsconfig.json ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์— reference ์ถ”๊ฐ€ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋„๋œ ๊ณ„์ธต๊ณผ ์ผ์น˜์‹œํ‚ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
outDir ๋ฅผ ์ถœ๋ ฅ ํด๋”์˜ ๋ช…์‹œ์  ํ•˜์œ„ ํด๋”๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ rootDir ๋ฅผ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ํด๋”์˜ ๊ณตํ†ต ๋ฃจํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

outFile์„ ์œ„ํ•œ ๊ตฌ์กฐํ™”

outFile ์‚ฌ์šฉํ•œ ์ปดํŒŒ์ผ ๋ ˆ์ด์•„์›ƒ์€ ์ƒ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.
๋ช…์‹ฌํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "๋งˆ์ง€๋ง‰" ํ”„๋กœ์ ํŠธ๊นŒ์ง€ prepend ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ํ–ฅ์ƒ๋˜๊ณ  ์ฃผ์–ด์ง„ ๋นŒ๋“œ์— ํ•„์š”ํ•œ I/O ์–‘์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
TypeScript ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ž์ฒด๋Š” ์—ฌ๊ธฐ์—์„œ ์ข‹์€ ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ" ํ”„๋กœ์ ํŠธ์™€ ์ผ๋ถ€ "์ข…์ " ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "์—”๋“œํฌ์ธํŠธ" ํ”„๋กœ์ ํŠธ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘๊ฒŒ ์œ ์ง€๋˜๊ณ  ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์œ„ํ•œ ๊ตฌ์กฐํ™”

TODO: ๋” ๋งŽ์ด ์‹คํ—˜ํ•˜๊ณ  ์ด๊ฒƒ์„ ์•Œ์•„๋‚ด์‹ญ์‹œ์˜ค. Rush์™€ Lerna๋Š” ์šฐ๋ฆฌ ์ชฝ์—์„œ ๋‹ค๋ฅธ ๊ฒƒ์„ ์•”์‹œํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ #25164์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh ์•„์ฃผ ๋ฉ‹์ง„ ๊ธ€๊ณผ ๋›ฐ์–ด๋‚œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํŠนํžˆ. ๊ตฌ์„ฑ ํŒŒ์ผ ์ฐธ์กฐ๊ฐ€ ์žˆ๋Š” ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๋กœ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋ฉฐ์น ์„ ๋ณด๋‚ธ ํ›„.

๋ช‡ ๊ฐ€์ง€ ๋ฉ”๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋…ธ๋ ˆํฌ๊ฐ€ ๋ญ”๊ฐ€์š”? ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์กฐ๊ธˆ ๋” ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  2. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ(ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ) ๋นŒ๋“œ ์ค‘์— ์ƒ์„ฑ๋˜๋Š” ์ถ”๊ฐ€ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๊ฟ€๊บฝ๊ฟ€๊บฝ(gulp)์„ ํ†ตํ•œ CSS, HTML, ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋นŒ๋“œ ๋„๊ตฌ์˜ ์‚ฌ์šฉ์ด ์ด ์ƒˆ๋กœ์šด ์ž‘์—… ๋ฐฉ์‹์— ์–ด๋–ป๊ฒŒ ์ฑ„ํƒ๋ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, *.ts ํŒŒ์ผ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ชจ๋“  ํŒŒ์ผ(์Šคํƒ€์ผ, ๋งˆํฌ์—… ๋“ฑ)์—์„œ๋„ watch๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๋ฐฉ๋ฒ•? gulp watch ๋ฐ tsc -b -w ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@vvs a monorepo๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Rush ๋˜๋Š” Lerna์™€ ๊ฐ™์€ ๋„๊ตฌ๋กœ ๊ด€๋ฆฌ๋˜๋Š” NPM ํŒจํ‚ค์ง€ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๋งˆ์‹œ๊ณ  ์žˆ๋‹ค๋ฉด ์ตœ๊ณ ์˜ ๊ฒฝํ—˜์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @rbuckton ์€ ๋‚ด๋ถ€์ ์œผ๋กœ gulpfile์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๋Š” ๊ทธ๊ณณ์—์„œ ์ข‹์€ ํŒจํ„ด์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๊ฐ€๋Š ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh ์ž˜ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Lerna ๊ฐ€์ด๋˜์Šค์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค :)

@RyanCavanaugh ์ด๊ฒƒ์€ ๋ฉ‹์ ธ ๋ณด์ž…๋‹ˆ๋‹ค. ์ €๋Š” ํ˜„์žฌ lerna monorepo๋กœ ์‹œํ—˜ํ•ด ๋ณด๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ๊ธ€์—์„œ ๋‚˜์—๊ฒŒ ์œ ์ผํ•˜๊ฒŒ ๋ถˆ๋ถ„๋ช…ํ•œ ๊ฒƒ์€ prepend ์˜ต์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€์ง€, ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์ž˜ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ต‰์žฅํ•˜๋‹ค! ์ €๋Š” ts-loader ๋ฐ ๊ด€๋ จ ํ”„๋กœ์ ํŠธ์—์„œ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. TypeScript์˜ LanguageServiceHost / WatchHost ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

(์ œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์˜ ์˜ˆ๋Š” https://github.com/TypeStrong/ts-loader/blob/master/src/servicesHost.ts๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.)

๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“  ์•ˆ๋‚ด/ํ™๋ณด ๊ฐ์‚ฌํžˆ ๋ฐ›๊ฒ ์Šต๋‹ˆ๋‹ค! ์‚ฌ์‹ค ์›นํŒฉ ์„ธ๊ณ„์—์„œ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋ฅผ ์›ํ•˜์‹ ๋‹ค๋ฉด ์ €๋Š” ์ด๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ts-loader ๋ฒ„์ „์„ ์ถœ์‹œํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  "๊ทธ๋ƒฅ ์ž‘๋™"ํ•œ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ์ผ!

@yortus @EisenbergEffect ์ €๋Š” https://github.com/RyanCavanaugh/learn-a์— ์ƒ˜ํ”Œ lerna repo๋ฅผ ์„ค์ •ํ–ˆ์œผ๋ฉฐ ์ž‘๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ทจํ•œ ๋‹จ๊ณ„๋ฅผ ์š”์•ฝํ•œ README๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ชจ๋“  ๊ฒƒ(X ๋ฐ ๋ชจ๋“  ์ข…์†์„ฑ ๋ฐ ์ „์ด ์ข…์†์„ฑ)์ด ์ตœ์‹  ์ƒํƒœ tsc -b X ๋Š” ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ฐธ์กฐ๊ฐ€ ์—†๋Š” ๊ฐœ๋ณ„ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด -b ํ”Œ๋ž˜๊ทธ ์—†์ด๋„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ? (๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ ์ข…์†์„ฑ์€ ์ œ์™ธ๋จ)

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

{
"๋ ˆ๋ฅด๋‚˜": "2.11.0",
"ํŒจํ‚ค์ง€": [
"ํŒจํ‚ค์ง€/๊ตฌ์„ฑ์š”์†Œ/ ","ํŒจํ‚ค์ง€/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ ",
"ํŒจํ‚ค์ง€/ํ”„๋ ˆ์ž„์›Œํฌ/ ","ํŒจํ‚ค์ง€/์‘์šฉ ํ”„๋กœ๊ทธ๋žจ/ ",
"ํŒจํ‚ค์ง€/๋„๊ตฌ/*"
],
"๋ฒ„์ „": "0.0.0"
}

typescript@next ์žˆ์Šต๋‹ˆ๊นŒ?

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

@RyanCavanaugh ์˜ค๋Š˜ ๋ฐค ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์œ„ํ•ด

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

ํ”„๋กœ์ ํŠธ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ECMA ํƒ€๊ฒŸํŒ…(es5, es6), ์œ ํ˜•(๋…ธ๋“œ, jest, DOM ๋“ฑ), ๋ฐฉ์ถœ(์ผ๋ถ€๋Š” ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ถ€๋Š” js ์ž์ฒด๋กœ ์ปดํŒŒ์ผ). ๊ทธ๋“ค์€ ๋ชจ๋‘ ํ•œ ๊ฐ€์ง€๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ tslint ํ”Œ๋Ÿฌ๊ทธ์ธ ์ž…๋‹ˆ๋‹ค . ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋„๊ตฌ๋Š” ๋˜ํ•œ ํ”„๋กœ์ ํŠธ ์ปดํŒŒ์ผ ํ›„์— tslint๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(ํ”„๋กœ์ ํŠธ๋‹น ๋ฐ tslint๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹ค์‹œ ์ปดํŒŒ์ผ๋˜๋Š” ๊ฒฝ์šฐ ์ค‘์ง€๋จ).

ํ˜„์žฌ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ์–ด๋–ค ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ด๋–ค ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š”์ง€ ๋งํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์ˆ˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๋Š” ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ•„ํ„ฐ๋กœ ๊ณ ์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. :)

์ €๋Š” ํ˜„์žฌ 17๊ฐœ์˜ ์ƒํ˜ธ ์˜์กด์ ์ธ ํŒจํ‚ค์ง€๋กœ ๊ตฌ์„ฑ๋œ lerna monorepo๋กœ ์ƒˆ๋กœ์šด --build ๋ชจ๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์ง€๋งŒ ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜๊ณ  ์ ์ง„์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ํฐ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด TS ํŒ€์— ์œ ์šฉํ•œ ํ”ผ๋“œ๋ฐฑ์ด๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํ”„๋กœ์ ํŠธ์—์„œ --build ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

tsc --build ๋ชจ๋“œ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ

1. ๊ฐ€์งœ "\์ถœ๋ ฅ ํŒŒ์ผ '2.map'์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ž˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค"

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

2. "\์ข…์†์„ฑ์—์„œ .d.ts ํŒŒ์ผ์ด ์ตœ์‹  ์ƒํƒœ์ž…๋‹ˆ๋‹ค."

ํŽธ์ง‘: #25337์—์„œ ๋ณด๊ณ ๋จ.

์ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๋ฉด ๊ทธ์˜ ์ง€์‹œ์— ๋”ฐ๋ผ @RyanCavanaugh ์˜ learn-a ์ƒ˜ํ”Œ ์ €์žฅ์†Œ ๋ฅผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. tsc -b packages --verbose ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์ด ์ฒ˜์Œ ๋นŒ๋“œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ pkg1/src/index.ts 1ํ–‰์„ import {} from "./foo"; ํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. tsc -b packages --verbose ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. pkg2 ๋Œ€ํ•œ ๋นŒ๋“œ๋Š” ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. pkg1 ๊ฐ€ pkg2 ์˜ ์†Œ์Šค๋ฅผ ์†์ƒ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ . ์ด์ œ pkg2/src/index.ts ์—์„œ ๋นจ๊ฐ„์ƒ‰ ๋ฌผ๊ฒฐ์„ ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. tsc -b packages --force ๋กœ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋ฉด ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฌธ์ œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด --force ๋กœ ๋นŒ๋“œํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

3. ๋‹ค์šด์ŠคํŠธ๋ฆผ ํŒจํ‚ค์ง€์—์„œ '์ค‘๋ณต ์‹๋ณ„์ž' ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” .d.ts ํŒŒ์ผ ์ƒ์„ฑ

ํŽธ์ง‘: #25338์—์„œ ๋ณด๊ณ ๋จ.

์ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๋ฉด ๊ทธ์˜ ์ง€์‹œ์— ๋”ฐ๋ผ @RyanCavanaugh ์˜ learn-a ์ƒ˜ํ”Œ ์ €์žฅ์†Œ ๋ฅผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ์ด์ œ lerna add @types/node ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์„ธ ํŒจํ‚ค์ง€ ๋ชจ๋‘์— Node.js ์ž…๋ ฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. tsc -b packages --force ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์—ฌ์ „ํžˆ ์ž˜ ๋นŒ๋“œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ pkg1/src/index.ts ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

// CASE1 - no build errors in pkg1, but 'duplicate identifier' build errors in pkg2
// import {parse} from 'url';
// export const bar = () => parse('bar');

// CASE2 - no build errors in pkg1 or in downstream packages
// import {parse, UrlWithStringQuery} from 'url';
// export const bar = (): UrlWithStringQuery => parse('bar');

// CASE3 - no build errors in pkg1 or in downstream packages
// export declare const bar: () => import("url").UrlWithStringQuery;

// CASE4 - no build errors in pkg1, but 'duplicate identifier' build errors in pkg2
// import {parse} from 'url';
// type UrlWithStringQuery = import("url").UrlWithStringQuery;
// export const bar = (): UrlWithStringQuery => parse('bar');

ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ผ€์ด์Šค ์ฃผ์„์„ ์ œ๊ฑฐํ•˜๊ณ  tsc -b packages --force . ์‚ฌ๋ก€ 1๊ณผ 4๋Š” pkg2 ์—์„œ ์—„์ฒญ๋‚œ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. ์‚ฌ๋ก€ 2์™€ 3์—์„œ๋Š” ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ๋ก€ 1๊ณผ 4์˜ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ์ƒ์„ฑ๋œ pkg1/lib/index.d.ts ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

/// <reference path="../node_modules/@types/node/index.d.ts" />

์‚ฌ๋ก€ 2์™€ 3์€ ์ด ์ค„์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. pkg2 ๊ฐ€ ์‚ฌ๋ก€ 1๊ณผ 4์—์„œ ๋นŒ๋“œ๋˜๋ฉด ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— @types/node ์„ ์–ธ์˜ ๋™์ผํ•œ ๋ณต์‚ฌ๋ณธ ๋‘ ๊ฐœ๊ฐ€ ํฌํ•จ๋˜์–ด '์ค‘๋ณต ์‹๋ณ„์ž' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์‚ฌ๋ก€ 2์™€ 3์ด ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ฝค ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ 4๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด pkg1 ์—๋Š” ๋นŒ๋“œ ์˜ค๋ฅ˜ ๋˜๋Š” ๊ฒฝ๊ณ ๊ฐ€ ์—†์ง€๋งŒ ๋‹ค์šด์ŠคํŠธ๋ฆผ ๋นŒ๋“œ ๋™์ž‘์€ ๋‚ด๋ณด๋‚ธ ์„ ์–ธ์˜ ์ •ํ™•ํ•œ ์Šคํƒ€์ผ์— ๋งค์šฐ ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. (a) pkg1 ๊ฐ€ ์‚ฌ๋ก€ 1๊ณผ 4์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ (b) 4๊ฐ€์ง€ ์‚ฌ๋ก€ ๋ชจ๋‘์— ๋™์ผํ•œ ๋‹ค์šด์ŠคํŠธ๋ฆผ ๋นŒ๋“œ ๋™์ž‘์ด ์žˆ์–ด์•ผ ํ•˜๊ฑฐ๋‚˜ (c) TS ํŒ€์˜ ๋ช…ํ™•ํ•œ ์ง€์นจ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์„ ์–ธ๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•.

4. Yarn ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•  ๋•Œ ์ƒ์„ฑ๋œ .d.ts ํŒŒ์ผ์˜ import ์œ ํ˜• ๋ฌธ์ œ

17 ํŒจํ‚ค์ง€ monorepo๋กœ ๋นŒ๋“œ ๋ชจ๋“œ๋ฅผ ์ž‘๋™์‹œํ‚ค๋ ค๊ณ  ํ•  ๋•Œ ์ƒ์„ฑ๋œ .d.ts ํŒŒ์ผ์—์„œ import ์œ ํ˜•์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์—ฌ๋Ÿฌ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งˆ์นจ๋‚ด ๋ชจ๋“ˆ ํ˜ธ์ด์ŠคํŒ…๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, yarn ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•  ๋•Œ ์„ค์น˜๋œ ๋ชจ๋“  ๋ชจ๋“ˆ์€ monorepo์˜ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํฌํ•จํ•˜์—ฌ monorepo-root node_modules ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํ˜ธ์ด์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค. lerna.json ์—์„œ packages ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋„๋ก monorepo๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ, ์ด๋กœ ์ธํ•ด lerna ๊ฐ€ ์ž์ฒด ๋น„ํ˜ธ์ด์ŠคํŒ… ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํ•‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋Š๋ฆฌ์ง€ ๋งŒ ๋” ์ข‹๊ณ  ์•ˆ์ „ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

TS๊ฐ€ ๋ชจ๋“ˆ ํ˜ธ์ด์ŠคํŠธ ์„ค์ •์„ ์ง€์›ํ•  ์˜๋„์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์žฌํ˜„์„ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ผ๋ถ€ ๋นŒ๋“œ๊ฐ€ ์ตœ์ƒ์œ„ packages ๋””๋ ‰ํ† ๋ฆฌ(tsconfig ์„ค์ •์— ๋”ฐ๋ผ)์™€ ์ตœ์ƒ์œ„ node_modules ๋””๋ ‰ํ† ๋ฆฌ( import ์ƒ์„ฑ๋œ .d.ts ํŒŒ์ผ์˜ import ์œ ํ˜•). ์ด๊ฒƒ์€ ๊ตฌ์กฐ์  ์œ ํ˜•์œผ๋กœ ์ธํ•ด ๋•Œ๋•Œ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‚ด๋ณด๋‚ธ ๊ณ ์œ  ๊ธฐํ˜ธ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

5. ๋ฐ˜๋ณต์ ์ธ ๊ตฌ์„ฑ

lerna๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก monorepo๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ "packages": ["packages/*"] in lerna.json ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. Lerna๋Š” globstars๋ฅผ ํ™•์žฅํ•˜์—ฌ ์ •ํ™•ํ•œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•œ ๋‹ค์Œ ๊ฐ ํŒจํ‚ค์ง€์˜ package.json ์„ ์–ธ๋œ ์ข…์†์„ฑ์„ ํ™•์ธํ•˜์—ฌ ์ •ํ™•ํ•œ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์™€ ์ข…์†์„ฑ์„ ๋งˆ์Œ๋Œ€๋กœ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ lerna ๊ตฌ์„ฑ์„ ๊ฑด๋“œ๋ฆด ํ•„์š” ์—†์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

TypeScript --build ๋ชจ๋“œ์—๋Š” ์ข€ ๋” ๋งŽ์€ ์˜์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธ€๋กœ๋ธŒ ํŒจํ„ด์€ ์ธ์‹๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ชจ๋“  ํŒจํ‚ค์ง€๋Š” @RyanCavanaugh ์˜ learn-a ์ƒ˜ํ”Œ ์ €์žฅ์†Œ์— ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ด๋˜๊ณ  ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: packages/tsconfig.json ). ๋นŒ๋“œ ๋ชจ๋“œ๋Š” package.json ์ข…์†์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ชจ๋“  ํŒจํ‚ค์ง€๋Š” package.json ํŒŒ์ผ( "dependencies" )๊ณผ tsconfig.json ํŒŒ์ผ์ž…๋‹ˆ๋‹ค( "references" ).

์ด๊ฒƒ์€ ์‚ฌ์†Œํ•œ ๋ถˆํŽธ์ด์ง€๋งŒ lerna's ์ ‘๊ทผ ๋ฐฉ์‹์— ๋น„ํ•ด ๋ฆฌ๊ทธ๋งˆ๋กค์ด ๋ˆˆ์— ๋„๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.

6. tsc ์ „์—ญ ๋ชจ๋“ˆ ํ™•์žฅ์œผ๋กœ ์ธํ•œ ์ถฉ๋Œ

ํŽธ์ง‘: #25339์—์„œ ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๋ฉด ๊ทธ์˜ ์ง€์‹œ์— ๋”ฐ๋ผ @RyanCavanaugh ์˜ learn-a ์ƒ˜ํ”Œ ์ €์žฅ์†Œ ๋ฅผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ์ด์ œ lerna add @types/multer ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์„ธ ํŒจํ‚ค์ง€ ๋ชจ๋‘์— multer ํƒ€์ดํ•‘์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. tsc -b packages --force ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์—ฌ์ „ํžˆ ์ž˜ ๋นŒ๋“œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ pkg1/src/index.ts ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

export {Options} from 'multer';

tsc -b packages --force ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์–ด์„ค์…˜ ์œ„๋ฐ˜์œผ๋กœ ์ธํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ์ถ”์ ๊ณผ ์ฃผ์žฅ์„ ๊ฐ„๋žตํžˆ ์‚ดํŽด๋ณด๋‹ˆ Express ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๊ธ€๋กœ๋ฒŒ ํ™•์žฅ๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ์— ๋Œ€ํ•ด @yortus ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. 3์˜ ๊ฒฝ์šฐ https://github.com/Microsoft/TypeScript/issues/25278 ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

4์˜ ๊ฒฝ์šฐ ๋ชจ๋“ˆ ํ˜ธ์ด์ŠคํŒ…์ด ๊ฐœ๋…์œผ๋กœ ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฑฐ๋‚˜ ์žฌํ˜„์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mhegazy lerna์™€ yarn์„ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด (์ €๋ฅผ ํฌํ•จํ•˜์—ฌ) ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ •๋ณด: https://yarnpkg.com/lang/en/docs/workspaces/

๊ธฐ๋ณธ tsconfig ์„ ์–ธ ์–ด๋””๋Š” ํ˜„์žฌ ์‹ค ์ž‘์—… ๊ณต๊ฐ„, lerna, ํ™•์žฅ tsconfigs์„ ์‚ฌ์šฉํ•˜๊ณ  paths ๊ฒŒ์–‘ ๋ชจ๋“ˆ๊ณผ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๊ณต์œ  ์•„๋ž˜์— root/node_modules . yarn ๋ฐ monorepo ๋“ค์„ ๋•Œ workspaces ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์‚ฌ์šฉ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ณ  ์ค‘๋ณต์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์˜ ์˜๋„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ธฐ๋ณธ tsconfig์— ์„ ์–ธ๋œ ๊ธธ๊ณ  ๊ณ ํ†ต์Šค๋Ÿฌ์šด paths ๊ฐ„๋‹จํžˆ ์ œ๊ฑฐํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฃจํŠธ monorepo tsconfig์˜ ์ƒ˜ํ”Œ์ž…๋‹ˆ๋‹ค(๋„์›€์ด ๋˜๋Š” ๊ฒฝ์šฐ):

{
  "extends": "./packages/build/tsconfig.base.json",
  "compilerOptions": {
    "baseUrl": "./packages",
    "paths": {
      "@alienfast/build/*": ["./build/src/*"],
      "@alienfast/common-node/*": ["./common-node/src/*"],
      "@alienfast/common/*": ["./common/src/*"],
      "@alienfast/concepts/*": ["./concepts/src/*"],
      "@alienfast/faas/*": ["./faas/src/*"],
      "@alienfast/math/*": ["./math/src/*"],
      "@alienfast/notifications/*": ["./notifications/src/*"],
      "@alienfast/ui/*": ["./ui/src/*"],
      "@alienfast/build": ["./build/src"],
      "@alienfast/common-node": ["./common-node/src"],
      "@alienfast/common": ["./common/src"],
      "@alienfast/concepts": ["./concepts/src"],
      "@alienfast/faas": ["./faas/src"],
      "@alienfast/math": ["./math/src"],
      "@alienfast/notifications": ["./notifications/src"],
      "@alienfast/ui": ["./ui/src"],
    }
  },
  "include": ["./typings/**/*", "./packages/*/src/**/*"],
  "exclude": ["node_modules", "./packages/*/node_modules"]
}

์ƒ˜ํ”Œ์„ ์œ„ํ•ด ํฌํฌ๋ฅผ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
https://github.com/RyanCavanaugh/learn-a

๋‹ค์Œ์€ ์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„์ด ์žˆ๋Š” @RyanCavanaugh ์˜ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋ณ‘ํ•ฉ
https://github.com/RyanCavanaugh/learn-a/pull/3/files

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ์— ๋ชจ๋“ˆ ๊ฒŒ์–‘์„ ์‚ฌ์šฉ Jupyterlab lerna์™€ ์›์‚ฌ. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ํŒจํ‚ค์ง€ ๊ฐ„์— ์„ค์น˜๋œ ์ข…์†์„ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฃจํŠธ ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ํ•œ ๋ฒˆ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

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

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

ํ˜ธ์ด์ŠคํŒ… ๋ฐœ์ƒ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํŒจํ‚ค์ง€์˜ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํŒจํ‚ค์ง€๋Š” ํ˜ธ์ด์ŠคํŒ…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ์กด์˜ ๋งŽ์€ ๋„๊ตฌ๋Š” node_modules ์œ„์น˜๋ฅผ ๊ฐ€์ •ํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ ๋ชจ๋“ˆ ํ™•์ธ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋”ฐ๋ฅด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ด์ŠคํŒ…์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ํŠน์ • ๋ชจ๋“ˆ์ด๋‚˜ ์ข…์†์„ฑ์— ๋Œ€ํ•œ ํ˜ธ์ด์ŠคํŒ…์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” nohoist ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ํ”ผ๋“œ๋ฐฑ์— ์—ฌ์„ฏ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. tsc ๋Š” ๊ฑฐ๊ธฐ์— ์„ค๋ช…๋œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

@mhegazy 3๋ฒˆ ํ•ญ๋ชฉ์ด #25278๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. #25278์€ ์ž˜๋ชป๋œ ์„ ์–ธ ๋ฐฉ์ถœ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์„ ์–ธ ํŒŒ์ผ์€ ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ์ƒ ์œ ํšจํ–ˆ์ง€๋งŒ ๋‹ค์šด์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ ์œ ํ˜• ์‚ฌ๋ณธ์œผ๋กœ ๋นŒ๋“œ๋˜์–ด '์ค‘๋ณต ์‹๋ณ„์ž' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด ๋ชจ๋“ˆ ํ˜ธ์ด์ŠคํŒ…์€ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋ฃจํŠธ node_modules ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋…ธ๋“œ ๋ชจ๋“ˆ ํ™•์ธ์ด ํ•ญ์ƒ ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ชจ๋“  node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

Btw ์ด ๋ชจ๋ธ์—๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ package.json ํŒŒ์ผ์— ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” "ํŒฌํ…€ ์ข…์†์„ฑ"์œผ๋กœ ์ด์–ด์ง€๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒŒ์‹œํ•  ๋•Œ (1) ํ…Œ์ŠคํŠธ/์˜ˆ์ƒ๋œ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ์ข…์†์„ฑ์ด ์„ค์น˜๋˜๊ฑฐ๋‚˜ (2) ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ด€๋ จ ์—†๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ํ˜ธ์ด์ŠคํŠธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข…์†์„ฑ์ด ์™„์ „ํžˆ ๋ˆ„๋ฝ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋งฅ๋ฝ์—์„œ. PNPM๊ณผ Rush์—๋Š” ๋ชจ๋‘ ํŒฌํ…€ ์ข…์†์„ฑ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

tsc --build ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ์กฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ์ธ์ˆ˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ ๋„๊ตฌ ์ฒด์ธ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์˜ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ „์ฒ˜๋ฆฌ
  • ์ง€์—ญํ™”๋œ ๋ฌธ์ž์—ด ์ƒ์„ฑ
  • ์ž์‚ฐ์„ JavaScript(css, ์ด๋ฏธ์ง€ ๋“ฑ)๋กœ ๋ณ€ํ™˜
  • ์ปดํŒŒ์ผ(ํƒ€์ž… ์ฒดํฌ/ํŠธ๋žœ์ŠคํŒŒ์ผ)
  • .js ํŒŒ์ผ ๋กค์—…(์˜ˆ: webpack)
  • .d.ts ํŒŒ์ผ ๋กค์—…(์˜ˆ: API ์ถ”์ถœ๊ธฐ)
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฌธ์„œ ์ƒ์„ฑ์„ ํฌํ•จํ•œ ์‚ฌํ›„ ์ฒ˜๋ฆฌ

์ผ๋ฐ˜์ ์œผ๋กœ Gulp ๋˜๋Š” Webpack๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฒด์ธ์˜ ์ค‘๊ฐ„์— ์žˆ๋Š” ํ•œ ๋‹จ๊ณ„์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๋ณด์กฐ ๋„๊ตฌ๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: jest --watch ์šฉ Jest+ts-jest ).

tsc ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์Šค์Šค๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ์กด ๋นŒ๋“œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๊ฐ€ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„ ์ž์ฒด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ ํ”„๋กœ์ ํŠธ ํด๋”์—์„œ tsc๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ(์ „์ฒ˜๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ ํ›„)?

๋˜๋Š” ๋””์ž์ธ์ด ๋‹จ์ผ ํŒจ์Šค๋กœ ์ „์ฒด monorepo๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด(์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๋ณ„๋„์˜ NodeJ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•จ) ๋‹ค๋ฅธ ๋นŒ๋“œ ์ž‘์—…์ด ์–ด๋–ป๊ฒŒ ์ฐธ์—ฌํ• ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์—์„œ webpack์„ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€? ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋ฅผ ํ•œ ๋ฒˆ์—? (๊ณผ๊ฑฐ์— ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.) ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค ๋™์‹œ์„ฑ์„ ํ™œ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์žƒ๊ฒŒ ๋ ๊นŒ์š”?

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

@pgonzal ๋งž์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ์—๋Š” tsc๊ฐ€ ์•„๋‹Œ ๋ถ€๋ถ„์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. lerna monorepo์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ–ˆ์Šต๋‹ˆ๋‹ค.

  • monorepo์˜ ๊ฐ ํŒจํ‚ค์ง€๋Š” ์„ ํƒ์ ์œผ๋กœ ์ •์˜ prebuild ์Šคํฌ๋ฆฝํŠธ ๋ฐ / ๋˜๋Š” postbuild ๊ทธ๊ฒƒ์—์„œ ์Šคํฌ๋ฆฝํŠธ package.json . ์—ฌ๊ธฐ์—๋Š” ๋นŒ๋“œ์˜ ๋น„ tsc ์ธก๋ฉด์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • monorepo์˜ package.json ์—๋Š” ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    "prebuild": "lerna run prebuild", "build": "tsc --build monorepo.tsconfig.json --verbose", "postbuild": "lerna run postbuild",
  • ๊ทธ๊ฒŒ ๋‹ค์•ผ monorepo ์ˆ˜์ค€์—์„œ yarn build ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด prebuild ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ tsc --build ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ ๋ชจ๋“  postbuild ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ. (NPM ์›์‚ฌ ๋ชจ๋‘ ๊ทœ์น™์— ๋”ฐ๋ผ ์‹คํ–‰ npm run foo ๋Œ€๋žต ๋™์ผํ•˜๋‹ค npm run prefoo && npm run foo && npm run postfoo .)

jest --watch ๋˜๋Š” webpack-dev-server ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์†Œ์Šค ํŒŒ์ผ์ด ์ˆ˜์ •๋˜๋ฉด ์‚ฌ์ „ ๋นŒ๋“œ/์‚ฌํ›„ ๋นŒ๋“œ ๋‹จ๊ณ„๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ts-node ๋ฐ ๊ด€๋ จ ์›Œํฌํ”Œ๋กœ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๊นŒ? "start": "ts-node ./src/app.ts" ๋˜๋Š” "start:debug": "node -r ts-node/register --inspect-brk ./src/app.ts" ์™€ ๊ฐ™์€ ์ผ๋ถ€ ๋„์šฐ๋ฏธ ์•ฑ์€ TypeScript์—์„œ "์ง์ ‘" ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

#25355์—์„œ ๋นŒ๋“œ ๋ชจ๋“œ์™€ ๊ด€๋ จ๋œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋“  ํ›Œ๋ฅญํ•œ ํ”ผ๋“œ๋ฐฑ๊ณผ ์กฐ์‚ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ๋‚ด์–ด ํ…Œ์ŠคํŠธํ•ด๋ณด๊ณ  ํƒ€์ด์–ด๋ฅผ ๊ฑท์–ด์ฐจ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@yortus re https://github.com/Microsoft/TypeScript/issues/3469#issuecomment -400439520

์ข‹์€ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ œ๊ณตํ•ด์ฃผ์…”์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฌธ์ œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ -

  1. ๊ฒฐ์ •๋œ
  2. #25370์—์„œ ํ™๋ณดํ•˜์„ธ์š”
  3. ๊ธฐ๋ก๋œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜ - ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฌด์—‡์ธ์ง€ ์ฆ‰์‹œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์ง€๋งŒ ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  4. ์กฐ์‚ฌ ์ค‘(์•„๋ž˜)
  5. ๊ธฐ๋ก #25376
  6. ๊ธฐ์ˆ ์ ์œผ๋กœ --build AFAICT์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ตœ๊ทผ์— ์ถ”๊ฐ€ํ•œ ์ƒˆ๋กœ์šด ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. ๋„ค์ด์„ ์˜ ์กฐ์‚ฌ

learn-a ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ PR์„ ์œ„ํ•ด @rosskevin ๐ŸŽ‰! ๋” ์ž˜ ๋น„๊ตํ•˜๊ณ  ๋Œ€์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ„๊ธฐ๋กœ ๋ณ‘ํ•ฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@pgonzal ๋‹ค์‹œ https://github.com/Microsoft/TypeScript/issues/3469#issuecomment -401577442

tsc --build์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ๋ฅผ ์กฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ์ธ์ˆ˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ?

์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ด ์งˆ๋ฌธ์— ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ๋Œ€๋‹ตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์•„๋‹™๋‹ˆ๋‹ค .

tsc ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ์˜ค๋Š˜ ํ–‰๋ณตํ–ˆ๋‹ค๋ฉด ๋‚ด์ผ๋„ tsc -b ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ํ–‰๋ณตํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. gulp ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ์˜ค๋Š˜ ํ–‰๋ณตํ–ˆ๋‹ค๋ฉด ๋‚ด์ผ๋„ gulp ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ํ–‰๋ณตํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฒซ ๋ฒˆ์งธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋„์™€์ค„ ๋„๊ตฌ ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ž‘์„ฑ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ tsc -b ์กฐ์ฐจ๋„ ๋„๊ตฌ ์ž‘์„ฑ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์žฌ์ƒ๋˜๋„๋ก ๋•๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ์ถœ๋œ API์— ๋Œ€ํ•œ ์–‡์€ ๋ž˜ํผ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ๋นŒ๋“œ ๋ชจ๋ธ์—์„œ.

๋” ๋„“์€ ๋งฅ๋ฝ์€ tsc -b ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋Š”์ง€, ์•„๋‹ˆ๋ฉด ๋ณ„๋„์˜ ๋„๊ตฌ/์ง„์ž…์ ์ด์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๊ฐ•๋ ฅํ•œ ๋‚ด๋ถ€ ๋…ผ์Ÿ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค tsc ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  ์ด์ œ ๋™์ผํ•œ ์ž‘์—… ์‹คํ–‰๊ธฐ๋กœ tsc -b ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋„ ๊ธฐ์กด ๋นŒ๋“œ ์ฒด์ธ์„ ์ œ์ž๋ฆฌ์— ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€ ์กฐ์ •๋งŒ์œผ๋กœ.

@borekb re https://github.com/Microsoft/TypeScript/issues/3469#issuecomment -401593804

์ด๊ฒƒ์ด ts-node ๋ฐ ๊ด€๋ จ ์›Œํฌํ”Œ๋กœ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๊นŒ? ์ผ๋ถ€ ๋„์šฐ๋ฏธ ์•ฑ์€ TypeScript์—์„œ "์ง์ ‘" ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์•”์‹œ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ๋‹จ์ผ ํŒŒ์ผ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ์šฐ ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

@EisenbergEffect ๋Š” learn-a ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์—์„œ ํ”„๋กœ์ ํŠธ ๊ฐ„ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ฐ ๊ธฐํƒ€ ์–ธ์–ด ์„œ๋น„์Šค ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ํฐ ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์€ ์ด ๊ธฐ๋Šฅ์„ 3.0์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ ๊ฐ„ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋Š” "์ •์ƒ ์ž‘๋™"ํ•  ๊ฒƒ์ด๋ฉฐ, ๋ชจ๋“  ๋‹ค์šด์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒฐ์ •์ ์œผ๋กœ ์ฐพ๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒฝ๊ณ ์— ๋”ฐ๋ผ - ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฐœ๊ฒฌ์  ๋ฐฉ๋ฒ•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” "์ตœ์„ ์˜ ๋…ธ๋ ฅ"์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ.

ํ”„๋กœ์ ํŠธ ๊ฐ„ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๊ฐ€ 3.0์— ๋Œ€ํ•ด ์•ˆ์ •์ ์ด๊ณ  ์™„์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ ๊ธฐํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ .d.ts ์ถœ๋ ฅ ํŒŒ์ผ์— ์žˆ๋Š” ๊ฒฝ์šฐ ์—๋งŒ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์ž‘์—…์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ˆ˜์ •๋œ ํ›„ ์—…์ŠคํŠธ๋ฆผ ํ”„๋กœ์ ํŠธ์˜ ํ›„์† ๋นŒ๋“œ์—์„œ .d.ts ํŒŒ์ผ์ด ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋กœ์ปฌ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ๋•Œ์™€ ์„ ์–ธ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ •์˜๋กœ ์ด๋™๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์˜ ๊ฒฝ์šฐ ํ˜„์žฌ VS Code์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Visual Studio์˜ ํ–ฅํ›„ ๋ฒ„์ „์—์„œ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ .d.ts.map ํŒŒ์ผ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( declarationMap ์ผœ๊ธฐ). ์ด๋ฅผ ๋ฐํžˆ๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋ณ„ ์ž‘์—…์ด ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ณด์ด๋ฉด ์ผ๋ถ€ ์‚ฌ๋ก€๋ฅผ ๋†“์ณค์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฒ„๊ทธ๋ฅผ ๊ธฐ๋กํ•˜์‹ญ์‹œ์˜ค.

ํ˜„์žฌ ์ถ”์  ์ค‘์ธ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ:

  • ํ”„๋กœ์ ํŠธ ๊ฐ„ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ - @andy-ms๊ฐ€ ๊ตฌํ˜„ ์ค‘์ž…๋‹ˆ๋‹ค.
  • ํ˜ธ์ด์ŠคํŒ…๋œ ๋ชจ๋“ˆ ์„ค์ •์„ ๋ถ„์„ํ•˜๊ณ  ๊ทธ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•จ - ๋‚˜์—๊ฒŒ
  • ์ƒ˜ํ”Œ์˜ ๋ฒ„์ „์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค learn-a REPO ๊ทธ ์šฉ๋„ yarn , ๋‹ค๋ฅธ ๊ทธ ์šฉ๋„ pnpm , ๋‹ค๋ฅธ ์šฉ๋„ ๊ฒŒ์–‘ ๋ชจ๋“œ์—์„œ ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ทธ

์—ด๋ฆฐ ์งˆ๋ฌธ

  • ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ์ถ”๋ก ํ•˜๊ธฐ ์œ„ํ•ด package.json ๋ฅผ ์ฝ๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ธฐ๋ก #25376
  • composite ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด .d.ts.map ๋ฐฉ์ถœ์„ ์•”์‹œ์ ์œผ๋กœ ์ผœ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@RyanCavanaugh ์ถ”๊ฐ€

ํ˜„์žฌ ์ถ”์  ์ค‘์ธ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ

๋˜ํ•œ LS์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์„ ์–ธ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ ํ”„๋กœ์ ํŠธ ์ถœ๋ ฅ ์œ„์น˜์™€ ๋ถ„๋ฆฌ๋œ ์ฆ๋ถ„ ์ถœ๋ ฅ ์บ์‹œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ค๋Š˜๋‚  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋นŒ๋“œํ•  ๋•Œ๊นŒ์ง€ ํŽธ์ง‘๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ์ „ํŒŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). stripInternal ๋ฐ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค ๋ณ€๊ฒฝ(์—ฌ๊ธฐ์„œ ๋นŒ๋“œ ์ถœ๋ ฅ์ด ์ œ์ž๋ฆฌ์—์„œ ๋ณ€๊ฒฝ๋˜์–ด LS ์ž‘์—…์— ์ ํ•ฉํ•˜์ง€ ์•Š์Œ).

์งˆ๋ฌธ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋“œ๋งต์—์„œ ํ™•์ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@aleksey-bykov typescript@next ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋ฐฉ๊ธˆ ์šฐ๋ฆฌ์˜ ์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„ ๊ธฐ๋ฐ˜ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ํ•œ ๊ฐ€์ง€๋Š” tsc --build --watch ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜์ง€๋งŒ ๋นŒ๋“œ๊ฐ€ ์ด์ œ ์ˆ˜์ •๋˜์—ˆ๋‹ค๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 2.9์˜ ํ‘œ์ค€ tsc ๊ฐ์‹œ ๋ชจ๋“œ๋Š” ์˜ค๋ฅ˜ ์นด์šดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ๊ฑฐ๊ธฐ์— 0์ด ํ‘œ์‹œ๋˜์–ด ๊ฑด๋ฌผ์ด ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” *.d.ts๋กœ ๊ฐ€๋“ ์ฐฌ ํด๋”๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

  • ๊ทธ๊ฒƒ์„ ํ”„๋กœ์ ํŠธ๋กœ ๋งŒ๋“ค๊ณ  ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค (์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค)
  • "ํฌํ•จ"์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

@timfish ๊ทธ ํ”ผ๋“œ๋ฐฑ์ด ๋‚ด๊ฐ€ ๋“ค์€ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก #25562

@aleksey-bykov https://github.com/Microsoft/TypeScript/issues/3469#issuecomment -400439520์€ ๋ช‡ ๊ฐ€์ง€ ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

@RyanCavanaugh ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋Š” commonjs ๋ฐ ๋…ธ๋“œ ๋ชจ๋“ˆ ํ•ด๊ฒฐ์—๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

๋‹น์‹ ์˜ ์˜ˆ์—์„œ :

import * as p1 from "@ryancavanaugh/pkg1";
import * as p2 from "@ryancavanaugh/pkg2";

p1.fn();
p2.fn4();
  1. @ryancavanaugh ๋ชจ๋“ˆ์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? TS๊ฐ€ ๋ชจ๋“ˆ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  2. ์ด ์˜ˆ์ œ๋Š” AMD(ํด๋ž˜์‹ ๋ชจ๋“ˆ ํ•ด์ƒ๋„)์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  3. ์ •์˜๋ฅผ ์ฐพ์œผ๋ ค๋ฉด outFile ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?
  4. d.ts ํŒŒ์ผ์€ ์ฐธ์กฐ ํ”„๋กœ์ ํŠธ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(์•„์ง๋„ outDir๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? TS์—์„œ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?)

๋‚˜๋Š” 2๊ฐœ์˜ ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ essentials ๋ฐ common ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ณตํ†ต์ ์€ ํ•„์ˆ˜ ํ•ญ๋ชฉ์œผ๋กœ ์ปดํŒŒ์ผ๋œ ํ•ญ๋ชฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

image

@aleksey-bykov

  1. ์ผ๋ฐ˜์ ์ธ ๋…ธ๋“œ ๋ชจ๋“ˆ ํ™•์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ํ™•์ธ๋œ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ๋ชจ๋“ˆ ์ด๋ฆ„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
  2. ํด๋ž˜์‹์„ ํฌํ•จํ•œ ๋ชจ๋“  ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—์„œ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ˆ์ œ ์ด๋ฆ„(๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ๋ชจ๋“ˆ)์€ ๋…ธ๋“œ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๊ทธ๋‹ค์ง€ ์นœ์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ์•„๋‹ˆ์š”
  4. TypeScript๋Š” .d.ts ํŒŒ์ผ์ด ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ๊ฐ€ ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๋Š” ์œ„์น˜์— ์žˆ๋Š”์ง€ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋ฅผ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh ์ œ๋ฐœ ํ•ด์ฃผ์„ธ์š”
์˜ˆ.zip

@RyanCavanaugh , tsc --build --watch ์†Œ์Šค ํŒŒ์ผ์˜ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ณผ ๋•Œ๊นŒ์ง€ ์ฒ˜์Œ์—๋Š” ํŒŒ์ผ์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊น๋‹ˆ๋‹ค(์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„ ๋ชจ๋‘์—์„œ). Lucky Issue number 100 * 2^8 : #25600์—์„œ ํ† ๋ก ์„ ์‹œ์ž‘ํ•ฉ์‹œ๋‹ค.

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