Typescript: tsc๋Š” rootDir ์™ธ๋ถ€์˜ ts ํŒŒ์ผ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 07์›” 21์ผ  ยท  87์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ: 2.0.0

.ts ํŒŒ์ผ์ด ํฌํ•จ๋œ fixtures ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด tsconfig.json rootDir ๋ฅผ src ์—ฌ๊ธฐ์—๋Š” ๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ(ํ…Œ์ŠคํŠธ ํฌํ•จ)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”ฝ์Šค์ฒ˜ ํŒŒ์ผ์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์šฉ์ž…๋‹ˆ๋‹ค. tsc๋Š” ์ž์‹ ์˜ ์กด์žฌ๋ฅผ ๋ถˆํ‰ํ•˜๊ณ  ์ปดํŒŒ์ผ์— ์‹คํŒจํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

Working as Intended

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

ใ…‹ใ…‹ใ…‹ ์ด๊ฒŒ ์ •๋ง ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฑด๊ฐ€์š”? ๋ฐฉ๊ธˆ ์ด๊ฒƒ์— ๋ถ€๋”ช์ณค๊ณ , ๋‚ด ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ํŠน์ • ํด๋”( rootDir ๋ฅผ ํ†ตํ•ด)์— ์žˆ๋‹ค๊ณ  typescript์— ๋งํ•œ ๋‹ค์Œ .ts ํ™•์žฅ์ž๊ฐ€ ํ•ด๋‹น ํด๋” ์™ธ๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •๋ง ์˜ค๋ฅ˜์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ rootDir ๋ฅผ ํ†ตํ•ด ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ๋งํ•˜๋ฉด ํ•ด๋‹น ์„ค์ •์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๊ณ  ์ถœ๋ ฅ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. rootDir ์—†๋Š” ํŒŒ์ผ์€ ๋ฌด์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ถœ๋ ฅ ํด๋” ๊ตฌ์กฐ์™€ ์ „ํ˜€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ถœ๋ ฅ์„ ๊ณ„์† ๋‚ด๋ณด๋‚ด์ง€ ์•Š๊ณ  ์™„์ „ํžˆ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!


๋‚˜๋ฅผ ๋”ฐ๋ผ ์˜ค๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ๋‹ค์Œ์€ ๋‹น์‹ ์ด _์‹ค์ œ๋กœ_ ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

{
    "compilerOptions": {
        "outDir": "./output",
        "rootDir": "./source",
    },
    "include": [
        "source"
    ]
}

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

์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด tsconfig.json ์— "์ œ์™ธ"๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

rootDir์€ ์ถœ๋ ฅ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ถœ๋ ฅ์„ ์“ธ ์œ„์น˜๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ํŒŒ์ผ์ด rootDir ์•„๋ž˜์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ฝ ์กฐ๊ฑด ์—†์ด rootDir ์•„๋ž˜์— ์žˆ์ง€ ์•Š์€ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 1. ์™„์ „ํžˆ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์œ„์น˜์—์„œ ๋‚ด๋ณด๋‚ด๊ฑฐ๋‚˜ 2. ์ „ํ˜€ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ž๋™ ์‹คํŒจ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@mhegazy ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. rootDir ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ baseURL ์ฒ˜๋Ÿผ ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ ํด๋” ๊ตฌ์กฐ ์ „์šฉ์ธ์ง€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

๋‚ด tsconfig.json์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "sourceMap": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "removeComments": true,
        "noImplicitAny": true,
        "rootDir": "src",
        "outDir": "build"
    },
    "exclude": [
        ".idea",
        "build",
        "node_modules",
        "typings/globals",
        "typings/modules"
    ]
}

๋‚ด ํด๋” ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

    • ์ง“๋‹ค

    • node_modules(../node_modules์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ)

    • node_modules

    • src

src ํด๋”์— ์žˆ๋Š” ๋‚ด .ts ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๊ณ  ๋™์ผํ•œ ํด๋” ๊ตฌ์กฐ๋กœ ๋นŒ๋“œ ํด๋”์— ์ถœ๋ ฅํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์„œ ๋ฃจํŠธ๋ฅผ ๋นŒ๋“œ ํด๋”๋กœ ์„ค์ •ํ•˜๊ณ  ๋‚ด src๋ฅผ ๋ฌธ์„œ ๋ฃจํŠธ์—์„œ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. node_modules ํด๋”์˜ .ts ํŒŒ์ผ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. OP์™€ ๋™์ผํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ๋‚˜๋Š” node_modules๋ฅผ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ tsc๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๊นŒ?

@HillTravis ๋ฌธ์ œ๋Š” https://github.com/Microsoft/TypeScript/issues/9552 ์™€ ๋™์ผํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

@mhegazy ๋™์ผํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๋‚ด ๊ตฌ์กฐ์—๋Š” symlink๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ํ•ด๋‹น symlink๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์œ„์น˜๋Š” ๋ฌด์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#9552์—๋Š” src ํด๋”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋นŒ๋“œ ์ค‘์ธ ๊ฒฝ๋กœ์— node_modules ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ tsc๊ฐ€ ๋ณด๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” node_modules๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” src์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํด๋”๋ฅผ ์ „ํ˜€ ๋ณด์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์œ„์— tsconfig.json์„ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ œ์™ธ๋œ node_modules ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ค‘์œผ๋กœ ๋ฌด์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ build ํด๋”๋ฅผ ์ œ์™ธํ–ˆ๊ณ  ๊ทธ ์•ˆ์— ์žˆ๋Š” node_modules์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ฎ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ #9552์—๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋‚˜ ์ปดํŒŒ์ผ ์‹คํŒจ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ TypeScript 1.8.10์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์–ธ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ TS6059: '/Users/thill/Projects/nrc/client/node_modules/ng2-datetime/src/ng2-datetime/ng2-datetime.module.ts' ํŒŒ์ผ์ด 'rootDir' '/Users/thill/Projects/์— ์—†์Šต๋‹ˆ๋‹ค. nrc/ํด๋ผ์ด์–ธํŠธ/src'. 'rootDir'์—๋Š” ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ TS6059: ํŒŒ์ผ '/Users/thill/Projects/nrc/client/node_modules/ng2-datetime/src/ng2-datetime/ng2-datetime.ts'๊ฐ€ 'rootDir' '/Users/thill/Projects/nrc/์— ์—†์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ/src'. 'rootDir'์—๋Š” ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ TS6059: '/Users/thill/Projects/nrc/client/node_modules/ng2-datetime/src/ng2-datetime/timepicker-event-interface.ts' ํŒŒ์ผ์ด 'rootDir' '/Users/thill/Projects/์— ์—†์Šต๋‹ˆ๋‹ค. nrc/ํด๋ผ์ด์–ธํŠธ/src'. 'rootDir'์—๋Š” ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@HillTravis ๋‹น์‹ ์€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ €๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :) ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์€ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์˜ ์ผ๊ด€์„ฑ์—†๋Š” ์ฒ˜๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋ชจ๋“ˆ ํ™•์ธ์„ ์œ„ํ•ด์„œ๋งŒ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋”ฐ๋ฅธ ๋‹ค์Œ ํ•ด๋‹น ์ด๋ฆ„์„ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๊ฒฝ๋กœ ๋Œ€์‹  ์‹ค์ œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํŒŒ์ผ์ด ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋กœ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ œ๊ฑฐํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค build ํด๋” ์ „์ฒด๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ tsc ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๋™์•ˆ ํŠน์ • ๋…ธ๋“œ ๋ชจ๋“ˆ(ng2-datetime)์˜ ์ฝ”๋“œ ๋‚ด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์‚ฌ์šฉ์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ–ˆ๋”๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์— ๊ด€๊ณ„์—†์ด ํ•ด๋‹น ๋…ธ๋“œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•  ๋•Œ๋งŒ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

GitHub์—์„œ ํ•ด๋‹น ํŒจํ‚ค์ง€์˜ ์†Œ์Šค๋ฅผ ๋ณด๋ฉด package.json ํŒŒ์ผ์— "main" ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ "ng2-datetime.js"๋กœ ์„ค์ •๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž‘์„ฑ์ž๋„ ๋™์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ .ts ํŒŒ์ผ์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„. ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. .d.ts ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  .ts ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•œ ํ›„์—๋„ ๋ฌธ์ œ ์—†์ด ์ปดํŒŒ์ผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์œ„์˜ OP๋Š” tsconfig.json์— "exclude"๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ์™ธํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์œ„์˜ OP๋Š” tsconfig.json์— "exclude"๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ์™ธํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์„ ํ™•์ธํ•  ๋•Œ tsc ํ•ญ์ƒ node_modules ์—์„œ ์ฐพ์œผ๋ ค๊ณ  ํ•˜๊ณ , ๊ฑฐ๊ธฐ์—๋Š” ์—†์Šต๋‹ˆ๋‹ค( typings ).

"tsc๋Š” rootDir ์™ธ๋ถ€์˜ ts ํŒŒ์ผ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค." ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์†Œ์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ณณ์ด๋ฏ€๋กœ typescript๊ฐ€ rootDir ์™ธ๋ถ€์˜ JS ํŒŒ์ผ์„ ๋ณด๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” "'rootDir'์€ ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์„ ํฌํ•จํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ํ‘œ์‹œ๋˜๋ฉด ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ ์™ธ๋ถ€์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์€ TS์— ๊ด€ํ•œ ํ•œ ์†Œ์Šค ํŒŒ์ผ๋กœ ์˜ˆ์ƒ๋˜๊ฑฐ๋‚˜ ๊ฐ€์ •๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์ด "์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™"์ด๋ผ๋ฉด ์ด ํ–‰๋™์˜ ์˜๋„ ๋˜๋Š” ๋™๊ธฐ๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? TS๊ฐ€ rootDir ์™ธ๋ถ€์— ์žˆ๋Š” ์†Œ์Šค ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฐ˜๋ฉด์— tsconfig์— "include" ์„น์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํฌํ•จํ•  ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ œ๊ณต๋˜๋ฉด TS๋Š” ๊ทธ ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ฐพ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ 1.8.10 ์‚ฌ์šฉ

๋‚ด homedir ~/node_modules node_modules ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ~/projects/myProject/ ์—์„œ tsc ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด typescript๊ฐ€ ๋‹ค์Œ ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

../../node_modules/aws-sdk/index.d.ts(7,1): error TS1128: Declaration or statement expected.
../../node_modules/aws-sdk/index.d.ts(7,11): error TS1005: ';' expected.
../../node_modules/aws-sdk/index.d.ts(7,24): error TS1005: '{' expected.
../../node_modules/aws-sdk/lib/config.d.ts(1,1): error TS1084: Invalid 'reference' directive syntax.
../../node_modules/aws-sdk/lib/config.d.ts(29,84): error TS1110: Type expected.
../../node_modules/aws-sdk/lib/config.d.ts(36,62): error TS1110: Type expected.
../../node_modules/aws-sdk/lib/config.d.ts(68,133): error TS1110: Type expected.
../../node_modules/aws-sdk/lib/config.d.ts(75,111): error TS1110: Type expected.
../../node_modules/aws-sdk/lib/request.d.ts(1,1): error TS1084: Invalid 'reference' directive syntax.
../../node_modules/aws-sdk/lib/services/glacier.d.ts(1,1): error TS1084: Invalid 'reference' directive syntax.

๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์— ๋…ธ๋“œ ๋ชจ๋“ˆ ํด๋”๊ฐ€์žˆ๋Š” ์ด์œ ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ.

@iwllyu [email protected] ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•˜๊ณ  ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํŒŒ์ผ ์„ธํŠธ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ 2.1.4์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Using tsc v1.8.10
../../node_modules/aws-sdk/index.d.ts(7,1): error TS1128: Declaration or statement expected.
../../node_modules/aws-sdk/index.d.ts(7,11): error TS1005: ';' expected.
../../node_modules/aws-sdk/index.d.ts(7,24): error TS1005: '{' expected.
../../node_modules/aws-sdk/lib/config.d.ts(27,84): error TS1110: Type expected.
../../node_modules/aws-sdk/lib/config.d.ts(34,62): error TS1110: Type expected.
../../node_modules/aws-sdk/lib/config.d.ts(66,133): error TS1110: Type expected.
../../node_modules/aws-sdk/lib/config.d.ts(73,111): error TS1110: Type expected.
Using tsc v2.1.4
../../node_modules/aws-sdk/lib/config.d.ts(38,37): error TS2304: Cannot find name 'Promise'.
../../node_modules/aws-sdk/lib/request.d.ts(164,16): error TS2304: Cannot find name 'Promise'.
../../node_modules/aws-sdk/lib/s3/managed_upload.d.ts(15,16): error TS2304: Cannot find name 'Promise'.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

์ด๊ฒƒ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ ํ๋ฆ„์„ ๊ณ ๋ คํ•˜๋ฉด Typescript๋Š” ์šฐ๋ฆฌ ํŒ€์— ๋„ˆ๋ฌด ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

์–˜๋“ค์•„, ์ง€๊ธˆ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐฑ์—”๋“œ ์ฝ”๋“œ ๋‚ด์—์„œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ์œ ํ˜• ์‚ฌ์šฉ ๋ฐ ๊ธฐํƒ€.

์ตœ์„ ์˜ ์„ ํƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฑฐ๊ธฐ์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ณ  ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ˆ˜์ •ํ•ฉ๋‹ˆ๊นŒ?

2๊ฐœ์˜ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ์™œ ๋ฐฑ์—”๋“œ tsconfig.json์— jsx์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์žˆ๊ณ  es2015๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ commonjs๋กœ ์ปดํŒŒ์ผ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

baseUrl ์ด(๊ฐ€) ์ ํ•ฉํ•ฉ๋‹ˆ๊นŒ?

@unional ์€ baseUrl์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“  node_modules ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

import * as request from "superagent";

ํ•˜์ง€๋งŒ

import * as request from "node_modules/superagent/..something";

?

ใ…‹ใ…‹ใ…‹ ์ด๊ฒŒ ์ •๋ง ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฑด๊ฐ€์š”? ๋ฐฉ๊ธˆ ์ด๊ฒƒ์— ๋ถ€๋”ช์ณค๊ณ , ๋‚ด ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ํŠน์ • ํด๋”( rootDir ๋ฅผ ํ†ตํ•ด)์— ์žˆ๋‹ค๊ณ  typescript์— ๋งํ•œ ๋‹ค์Œ .ts ํ™•์žฅ์ž๊ฐ€ ํ•ด๋‹น ํด๋” ์™ธ๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •๋ง ์˜ค๋ฅ˜์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ rootDir ๋ฅผ ํ†ตํ•ด ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ๋งํ•˜๋ฉด ํ•ด๋‹น ์„ค์ •์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๊ณ  ์ถœ๋ ฅ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. rootDir ์—†๋Š” ํŒŒ์ผ์€ ๋ฌด์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ถœ๋ ฅ ํด๋” ๊ตฌ์กฐ์™€ ์ „ํ˜€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ถœ๋ ฅ์„ ๊ณ„์† ๋‚ด๋ณด๋‚ด์ง€ ์•Š๊ณ  ์™„์ „ํžˆ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!


๋‚˜๋ฅผ ๋”ฐ๋ผ ์˜ค๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ๋‹ค์Œ์€ ๋‹น์‹ ์ด _์‹ค์ œ๋กœ_ ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

{
    "compilerOptions": {
        "outDir": "./output",
        "rootDir": "./source",
    },
    "include": [
        "source"
    ]
}

๋‚ด ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ํŠน์ • ํด๋”(rootDir๋ฅผ ํ†ตํ•ด)์— ์žˆ๋‹ค๊ณ  typescript์— ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ rootDir ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค! rootDir ๋Š” "์ด ํด๋”๋ฅผ outDir ์˜ ๊ฒฝ๋กœ ๊ณ„์‚ฐ์„ ์œ„ํ•œ ์ƒ๋Œ€์  ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์˜ ์ผ๋ถ€์ธ ํŒŒ์ผ์€ files ๋ฐ/๋˜๋Š” include / exclude ๋กœ ๋‹ต๋ณ€๋˜๋Š” ๋ณ„๋„์˜ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ์ˆ˜๋ฝํ•˜๋”๋ผ๋„ ํ˜„์žฌ ๋™์ž‘์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜ค๋ฅ˜ IMO์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ ์™ธ๋ถ€์— TS ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ rootDir ๋Š” outDir ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ธฐ์ดˆ๊ฐ€ ๋˜์ง€ _์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Š” ๋‚ด๊ฐ€ ์ง€์ •ํ•œ ๊ตฌ์„ฑ์ด ์™„์ „ํžˆ ๋ฌด์‹œ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด๊ฐ€ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์„ ๋ถ€์—ฌํ–ˆ๋‹ค๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋“œ ์‹คํŒจ๊ฐ€ ํ›จ์”ฌ ๋” ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ตฌ์„ฑ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ (IMO) ์ด ์œ ํ˜•์˜ ์‹คํŒจ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์˜ˆ(ํ•˜๋“œ ์‹คํŒจ์™€ ํ•จ๊ป˜):

TSC๊ฐ€ rootDir ์™ธ๋ถ€์— ์žˆ๋Š” typescript ํŒŒ์ผ์„ ์ฐพ์•˜์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  typescript ํŒŒ์ผ์„ ํฌํ•จํ•˜๋„๋ก rootDir ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ rootDir ์™ธ๋ถ€์˜ ํŒŒ์ผ์„ ์ œ์™ธํ•˜๊ฑฐ๋‚˜ rootDir ๋‚ด๋ถ€์˜ ํŒŒ์ผ๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : rootDir์˜ ํ˜„์žฌ ๋™์ž‘์ด ๋งค์šฐ ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ๋Š๋ผ๋Š” ์ด์œ ์˜ ํฐ ๋ถ€๋ถ„์€ ๋ฐ”๋กœ rootDir ์™ธ๋ถ€์— ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ด์น˜์— ๋งž์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. rootDir ์™ธ๋ถ€์—์„œ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์Šค์Šค๋กœ(๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ)์—๊ฒŒ ๋ฌผ์„ ๋•Œ ์œ ์ผํ•œ ๋Œ€๋‹ต์€ "์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ rootDir์ด sourceDir๋„ ์ง€์ •ํ•œ๋‹ค๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์•…์€ ์ด๋ฆ„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ relativePathBaseDir ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ include ์ผ๋ฐ˜์ ์œผ๋กœ "์—ฌ๊ธฐ๋„ ๋ณด์„ธ์š”"๋ฅผ ์˜๋ฏธํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋Š” "์—ฌ๊ธฐ๋งŒ ๋ณด๊ธฐ"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์˜๋ฌดํ™”๋˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

IMO ์ด ์˜๊ฒฌ ์€ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ฒ„๊ทธ์ด๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•จ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํŠนํžˆ ๊ณ ๋ ค๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : rootDir์˜ ํ˜„์žฌ ๋™์ž‘์ด ๋งค์šฐ ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ๋Š๋ผ๋Š” ์ด์œ ์˜ ํฐ ๋ถ€๋ถ„์€ ๋ฐ”๋กœ rootDir ์™ธ๋ถ€์— ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ด์น˜์— ๋งž์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. rootDir ์™ธ๋ถ€์—์„œ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์Šค์Šค๋กœ(๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ)์—๊ฒŒ ๋ฌผ์„ ๋•Œ ์œ ์ผํ•œ ๋Œ€๋‹ต์€ "์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๊ทธ๊ฒƒ์€ ๋ง์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . " rootDir ์™ธ๋ถ€์˜ ์†Œ์Šค ํŒŒ์ผ" ์€ ํŒŒ์ผ ํ™•์žฅ์ž๋‚˜ ๋‚ด์šฉ์— ๊ด€๊ณ„์—†์ด ๋‹จ์ˆœํžˆ

์ด๊ฒƒ์€ ๋ฒ„๊ทธ๋ผ๋Š” ์ ์—์„œ +100์ž…๋‹ˆ๋‹ค(์‹ค์ œ๋กœ๋Š” ๋ถˆ์พŒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋‹ค์Œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

- src/
  - module.ts
- test/
  - module.test.ts
- out/
  - module.js

ts-node ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— tsc ๋งŒ src ๋งŒ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. rootDir: 'src' ๊ฐ€ ์žˆ์œผ๋ฉด ํ˜„์žฌ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ts-node ๋กœ๋งŒ ์‹คํ–‰ํ•˜๋ ค๋Š” ํ…Œ์ŠคํŠธ ๋ฐ ๊ธฐํƒ€ ํ•ญ๋ชฉ์„ "์ œ์™ธ๋จ"์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉด ๋‚˜์œ ์ผ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: vscode ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ํ…Œ์ŠคํŠธ์—์„œ ๊นจ์ง ).

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

๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋…ํŠนํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ ์–ด๋„ UX ๊ด€์ ์—์„œ "์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘์—…" ๋ ˆ์ด๋ธ”์„ ์žฌ๊ณ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

src / test / out ์„ค์ •์€ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์—์„œ ํ•ด๊ฒฐํ•œ ์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค์˜€์Šต๋‹ˆ๋‹ค.

rootDir ์„ค์ •ํ•œ ํ›„ typescript๊ฐ€ ๋‚ด webpack.config.js ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ด์œ ๋ฅผ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ ํ•˜๋‹ค๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ํŠน์ • ํด๋”(rootDir๋ฅผ ํ†ตํ•ด)์— ์žˆ๋‹ค๊ณ  typescript์— ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ rootDir์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค! rootDir์€ "outDir์˜ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ์ƒ๋Œ€์  ๊ธฐ์ค€์œผ๋กœ ์ด ํด๋”๋ฅผ ์‚ฌ์šฉ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ํŒŒ์ผ์ด ์ปดํŒŒ์ผ์˜ ์ผ๋ถ€์ธ์ง€๋Š” ํŒŒ์ผ ๋ฐ/๋˜๋Š” ํฌํ•จ/์ œ์™ธ์— ์˜ํ•ด ๋‹ต๋ณ€๋˜๋Š” ๋ณ„๋„์˜ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‹ต์ด๋‹ค! rootDir์— ๋Œ€ํ•œ ๋ฌธ์„œ ๋Š” ๋งํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ ํŒŒ์ผ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

"์ž…๋ ฅ _source_ ํŒŒ์ผ"์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ–ˆ์Šต๋‹ˆ๋‹ค. @RyanCavanaugh ์˜ ์˜๊ฒฌ์ด ์ด ์˜ต์…˜์— ๋Œ€ํ•œ ํ˜„์žฌ ์„ค๋ช…์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋งํฌ - https://github.com/Microsoft/TypeScript/issues/11299 ๋Š” ์ด ๋ฌธ์ œ์˜ ๋ณต์ œ๋ณธ์ž…๋‹ˆ๋‹ค. (ํ•ด๊ฒฐ์ฑ…: include/exclude๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ•  ํŒŒ์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. rootDir์€ ์ปดํŒŒ์ผํ•  ํŒŒ์ผ์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

@mhegazy ์ด ํšจ๊ณผ์— ํ•ด๋‹น ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์ถ”๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ์งˆ๋ฌธ์ž๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(TS๊ฐ€ RootDir ์™ธ๋ถ€์˜ ํŒŒ์ผ์„ ๋ณด๋Š” ์ด์œ ์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  rootDir์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜คํ•ด).

์ €๋„ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์œผ๋ฉฐ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

tsc ์ปดํŒŒ์ผ์ด ํŠธ๋ฆฌ๋ฅผ ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ƒ์œ„ ํด๋”๋กœ ์ด๋™ํ•˜์—ฌ ์ค‘๋ณต ์œ ํ˜• ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค‘์ฒฉ ํด๋” ๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โ””โ”€src
โ””โ”€package.json
โ””โ”€node_modules
โ””โ”€tsconfig.json
โ””โ”€example
โ”‚ โ””โ”€src
โ”‚ โ””โ”€package.json
โ”‚ โ””โ”€node_modules
โ”‚ โ””โ”€tsconfig.json

์ด์ œ ์˜ˆ์ œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ tsc๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

node_modules/@types/react/index.d.ts:2809:14 - error TS2300: Duplicate identifier 'LibraryManagedAttributes'.

2809         type LibraryManagedAttributes<C, P> = C extends React.MemoExoticComponent<infer T> | React.LazyExoticComponent<infer T>
                  ~~~~~~~~~~~~~~~~~~~~~~~~

  ../node_modules/@types/react/index.d.ts:2814:14
    2814         type LibraryManagedAttributes<C, P> = C extends React.MemoExoticComponent<infer T> | React.LazyExoticComponent<infer T>
                      ~~~~~~~~~~~~~~~~~~~~~~~~
    'LibraryManagedAttributes' was also declared here.

์˜ค๋ฅ˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด tsc๋Š” ์˜ˆ์ œ ํด๋”์—์„œ ํŠธ๋ฆฌ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€์„œ ๋ถ€๋ชจ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ node_modules ํด๋”๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ๋” ๋‚˜์œ ๋Š๋‚Œ์€ ๊ฑฐ์˜ ํšจ๊ณผ ์—†์ด ์ƒ์œ„ node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฌด์‹œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์˜ˆ์ œ ๋””๋ ‰ํ† ๋ฆฌ์˜ tsconfig์ž…๋‹ˆ๋‹ค.

{
  "compilerOptions": {
    "target": "es5",
    "experimentalDecorators": true,
    "module": "commonjs",
    "sourceMap": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "moduleResolution": "node",
    "lib": ["es2017", "dom"],
    "jsx": "react"
  }
,
  "typeRoots": [
    "./node_modules/@types"
  ],
  "include": [
    "src"
  ],
  "exclude": [
    "node_modules",
    "../node_modules"
  ]
}

์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์œ„์˜ ์–ด๋Š ๊ฒƒ๋„ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

@lexwebb ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. @types/react ์— ๋™์ผํ•œ ๋ฒ„์ „์ด ์žˆ๋Š” yarn.lock ํŒŒ์ผ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
https://stackoverflow.com/questions/52399839/typescript-duplicate-identifier-librarymanagedattributes๋ฅผ ์ฐธ์กฐ

๋‚ด ์ž์‚ฐ ํด๋”์— ํ™•์žฅ์ž๊ฐ€ .ts ์ธ "MPEG Transport Stream" ๋น„๋””์˜ค ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํด๋”๊ฐ€ ๋‚ด rootDir ๊ฒฝ๋กœ์— ์—†์–ด๋„ tsc ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

exclude ๊ฒฝ๋กœ์— assets ํด๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ, ๋ถˆ์•ˆํ•œ ํ–‰๋™์ด์—ˆ์Šต๋‹ˆ๋‹ค ๐Ÿค”

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

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

๋‚ด ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด typescript ๋นŒ๋“œ๊ฐ€ rootDir ํŠธ๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚˜์„œ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์„ ๋นŒ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ์ด์œ ๋Š” ๋‹น์‹ ์ด (์˜๋„์ ์œผ๋กœ ๋˜๋Š” ๋ถ€์ฃผ์˜ํ•˜๊ฒŒ) ์ง์ ‘ ๋˜๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐธ์กฐํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. rootDir ๋‚ด์˜ ์˜์—ญ. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฐธ์กฐ ํŒŒ์ผ์ด ํฌํ•จ๋œ ์˜์—ญ์„ ์ œ์™ธํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋นŒ๋“œ๊ฐ€ ์ฐธ์กฐ ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” PITA๊ฐ€ ์–ด๋–ป๊ฒŒ/์–ด๋””์„œ โ€‹โ€‹๊ทธ๊ฒƒ์„ ํ–ˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด tsc ์˜ ์ž˜๋ชป์ด ์•„๋‹ˆ๋ผ ์ œ ์ž์‹ ์˜ ์ž˜๋ชป์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง€์‹œํ•œ ๋Œ€๋กœ ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

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

HTH ์ผ๋ถ€๋Š” ๊ณ ํ†ต์˜ ๊ทผ์›์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋ฆฌ ๋งŽ์€ ๊ตฌ์„ฑ์„ ํ•ด๋„ ๋น ์ ธ๋‚˜์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌ์กฐ๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ œ์–ดํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@kpturner ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฌ์ง€๋งŒ โ€” ํด๋” ๊ฐ„ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์—†๋Š” ๋ฒ ์–ด๋ณธ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋Š” ๋ชจ๋‘๊ฐ€ ๋ถˆํ‰ํ•˜๋Š” ๋™์ž‘์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ง„์งœ? ํ•œ ๋ฒˆ๋„ ๋ณธ ์ ์ด ์—†๋Š” ๊ฒƒ :)

์ œ์™ธ๋œ ํด๋”๋Š” ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ์ƒํ™ฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ํ•ญ์ƒ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์— ๋ฒ ์–ด ๋ณธ ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ ํฐ์œผ๋กœ๋Š” ๋ง์”€๋“œ๋ฆฌ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์ œ๋Š” ์ œ๊ฐ€ ์–ธ๊ธ‰ํ•˜๋Š” '์™„์ „ํ•œ ๋ผˆ๋Œ€' ์ƒํ™ฉ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋™์ž‘์˜ ์›์ธ์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(๊ทธ๋ ‡๋‹ค๋ฉด ๋” ์ดํ•ด๊ฐ€ ๊ฐ€๊ฒ ์ง€๋งŒ).

์ฆ‰, ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ปดํŒŒ์ผํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

-src / src.ts <- no imports -test / test.ts -out -tsconfig.json {"rootDir": "src", "outDir": "out"}

๊ทธ๋Ÿฌ๋‚˜ tsconfig.json ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ธ๋‹ค๋ฉด typescript๊ฐ€ src ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ๊ฒƒ๊ณผ test ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ๊ฒƒ์„ ์ปดํŒŒ์ผํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹จ์ง€ ๋‹จ์ง€์—์„œ ๋ฌผ๊ฑด transpileํ•˜๋ ค๋ฉด src ์™€ ์ถœ๋ ฅ out ๋‹ค์Œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‹น์‹ ์˜ tsconfig.json ํ•  ๊ฒƒ

{
    "compilerOptions": {
        "rootDir": "src",
        "outDir": "out"
    }
}

๊ทธ๋Ÿฌ๋ฉด rootDir ์™ธ๋ถ€์— ์ผ๋ถ€ ํŒŒ์ผ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— TS6059 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ์„ ์ œ์™ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{
    "compilerOptions": {
        "rootDir": "src",
        "outDir": "out"
    },
    "exclude": [
        "test"
    ]
}

ํŠธ๋žœ์ŠคํŒŒ์ผ๋˜๋ฉด src ํฌํ•จ๋œ src.js src ํ•˜์œ„ ํด๋”๊ฐ€ ์žˆ๋Š” out ํด๋”๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. test ํด๋”๋Š” ์™„์ „ํžˆ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์•„๋‹ˆ์š”?

์–ด, ์‹ค์ œ๋กœ ๋‚ด ์˜ˆ์ œ tsconfig ๋Š” ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด rootDir ๋ฐ outDir ์•„๋ž˜์— compilerOptions ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ test , test ๋ฐ ํ•ด๋‹น ํŒŒ์ผ์„ ์ œ์™ธํ•  ๋•Œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ์›๋ž˜, ๋‚˜๋Š” ๋‹น์‹ ์ด TS6059 ์˜ค๋ฅ˜์˜ (๋˜๋Š”) ๋ฒ”์ธ์ด rootDir ์™ธ๋ถ€ rootDir ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ๋‹น์‹ ์„ ์ž˜๋ชป ์ฝ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  rootDir ์™ธ๋ถ€์˜ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๊ท€ํ•˜๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์™ธ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”. (์ด์ „) ์ฐธ์กฐ ํŠธ๋ฆฌ๊ฐ€ ์ œ์™ธ ๋ชฉ๋ก์— ํŠธ๋žœ์ŠคํŒŒ์ผ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

TS6059 ์˜ค๋ฅ˜๋Š” ์ฒ˜์Œ์—๋Š” ์•ฝ๊ฐ„ ๋‹นํ˜น์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” TS๊ฐ€ ์ œ๊ฐ€ ์‹ค์ˆ˜๋ฅผ ํ•˜์ง€ ์•Š๋„๋ก ๋„์™€์ฃผ๋ ค๋Š” ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ rootDir์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๊ณ  plonk typescript๊ฐ€ ํ•ด๋‹น rootDir ์™ธ๋ถ€๋กœ ๋‚ ์•„๊ฐ„๋‹ค๋ฉด TS๋Š” ํšจ๊ณผ์ ์œผ๋กœ "oi - ๋‹น์‹ ์ด ๋‚ด๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” typescript๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค - ๋งž์Šต๋‹ˆ๊นŒ?"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” "์•„๋‹ˆ์š”, ์ž˜๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋Œ€๋‹ตํ•˜๊ณ  ํŒŒ์ผ์„ rootDir๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.
๋˜๋Š”
"๋„ค ๋งž์Šต๋‹ˆ๋‹ค. ์•Œ๋ ค์ฃผ์ง€ ์•Š์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•œ ๋‹ค์Œ ์ œ์™ธ ํŒŒ์ผ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” monorepo๊ฐ€ โ€‹โ€‹์žˆ๊ณ  paths ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ (๊ฐ™์€ monorepo์—์„œ) ๋กœ์ปฌ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์˜ฌ๋ฐ”๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ๊ฐ ํŒจํ‚ค์ง€๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์— ์›์น˜ ์•Š๋Š” ์ƒ์œ„ ํด๋”๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ tsc๊ฐ€ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์™ธ๋ถ€์— ์žˆ๋Š” ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณต์žกํ•  ์ˆ˜ ์—†๊ฒ ์ฃ ?

์–ด๋–ค ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜๋“  tsc ๋Š” paths ๊ฐ€ ๋™์ผํ•œ monorepo์˜ ๋กœ์ปฌ ํŒจํ‚ค์ง€๋ฅผ ์ฐธ์กฐํ•˜๋Š” monorepo๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. --build , --project , references , paths , extends , rootDir , rootDirs , include , exclude , baseUrl , outDir ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ง„ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์กฐํ•ฉ์—์„œ ๊ฒฐ๊ตญ rootDir ๋‚ด์— ์—†๋Š” ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค outDir ๋‚ด๋ถ€์— ์ž˜๋ชป๋œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‚ด๋ณด๋ƒ„์œผ๋กœ์จ ์—‰๋ง์ด ๋ฉ๋‹ˆ๋‹ค.

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

๊ฝค ์˜ค๋žœ ์‹œ๊ฐ„ ๋…ธ๋ ฅํ•˜๊ณ  ์ˆ˜์ •ํ•œ ํ›„์— lerna์™€ typescript ๊ฐ€ references ์™€ ํ•จ๊ป˜ paths ๋ฐ ์‚ฌ์šฉ์— ๋” ์ด์ƒ ์งˆ์‹ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค rootDir .

rootDir์€ ์ถœ๋ ฅ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ถœ๋ ฅ์„ ์“ธ ์œ„์น˜๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ํŒŒ์ผ์ด rootDir ์•„๋ž˜์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ํŒŒ์ผ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋ฃจํŠธ ์™ธ๋ถ€์— json ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

const errors = require("../../../../errors.json");

ES6 ๋ฒ„์ „์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—:

import * as errors from "../../../../errors.json";

๊ทธ๋Ÿฌ๋‚˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์—์„œ๋Š” ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ์žƒ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@mhegazy ์ด ๋ฌธ์ œ๋Š” 3๋…„ ์ „์— ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 3๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๋„ ์—ฌ์ „ํžˆ ํ˜ผ๋ž€์˜ ์›์ธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

์ด "์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘์—… ์ค‘" ์ƒํƒœ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ฐ˜์‘์„ ๊ณ ๋ คํ•  ๋•Œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „

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

@ngryman ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? rootDir ์— ์ •์˜ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ์†Œ์Šค ํŒŒ์ผ์˜ ๊ณตํ†ต ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค. rootDir ์ •์˜์— ๋”ฐ๋ฅด๋ฉด ํŒŒ์ผ์ด ๊ณตํ†ต ๋ฃจํŠธ์— ์—†์œผ๋ฉด ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๊ทธ ์ •์˜๋Š” ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด rootDir ๋Œ€ํ•ด ์ž์‹ ๋งŒ์˜ ์ •์˜๋ฅผ ๋งŒ๋“ค์–ด ๋ƒˆ๊ณ  ์ดํ›„์— ๋†€๋ž๋‹ค๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ์•„๋ฌด ๋ง๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์Šคํƒ€๋ฒ…์Šค์— ๊ฐ€์„œ ๋ผ๋–ผ๋ฅผ ์š”์ฒญํ•œ๋‹ค๊ณ  ํ•ด์„œ ์—์Šคํ”„๋ ˆ์†Œ์™€ ์ฐ ์šฐ์œ ๊ฐ€ ์„ž์ด์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ •์˜์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅ

https://github.com/microsoft/TypeScript/issues/9858#issuecomment -370653478์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹จ์ˆœํžˆ ๋” ๋‚˜์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์— ๋ถ€๋”ช์ณค๊ณ  ๊ฒฐ๊ตญ ์ด GitHub ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ, ๊ฐ€์žฅ ํฐ ์ขŒ์ ˆ์€ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ–ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ๊ทธ๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๊ทธ๋Ÿฐ ๋‹ค์Œ ์žฌํ˜„ ์‚ฌ๋ก€๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ๋Ÿฐ ๋‹ค์Œ "์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™"์ด๋ผ๋Š” ์ค‘๋ณต ๋ฒ„๊ทธ. ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ–ˆ๋‹ค๋ฉด ๊ทธ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@RyanCavanaugh ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด: https://www.typescriptlang.org/docs/handbook/compiler-options.html. ๋‹ค์Œ ์ •์˜๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅ ํŒŒ์ผ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. --outDir์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฐ๋งŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

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

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

์Šคํƒ€๋ฒ… ์˜ˆ์‹œ๋ฅผ ๋งˆ์น˜๋ ค๋ฉด ์žฌ๋ฃŒ ๋ชฉ๋ก์— "์ต์Šคํ”„๋ ˆ์†Œ์™€ ์ŠคํŒ€ ์šฐ์œ ์˜ ํ˜ผํ•ฉ๋ฌผ"์ด๋ผ๊ณ  ์ž˜ ์ ์–ด์„œ ๋ผ๋–ผ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์ถ”์ธกํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

rootDir ์™ธ๋ถ€์— ์žˆ๋Š” ํŒŒ์ผ์˜ ์˜๋ฏธ๋Š” TS๊ฐ€ outDir ์™ธ๋ถ€์— ํŒŒ์ผ์„ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ช…๋ฐฑํžˆ ๋‚˜์œ ๋™์ž‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ œ์•ˆ์ด๋‚˜ PR์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ๋Š” ํ•ญ์ƒ ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ๋žŒ๋“ค์„ ๋ฐ”๋ณด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์•”์‹œํ•˜๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋” ์ด์ƒ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

rootDir ์™ธ๋ถ€์— ์žˆ๋Š” ํŒŒ์ผ์˜ ์˜๋ฏธ๋Š” TS๊ฐ€ outDir ์™ธ๋ถ€์— ํŒŒ์ผ์„ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๋Š” ๋ช…๋ฐฑํžˆ ๋‚˜์œ ๋™์ž‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ rootDir "chroot"ํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ ์™ธ๋ถ€์˜ ํŒŒ์ผ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. tsc ๋‚ด๋ถ€ ๋ฐ ๊ธฐ๋ก์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ถ€์กฑํ•œ ์‚ฌ์šฉ์ž๋กœ์„œ ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ํ–‰๋™์ž…๋‹ˆ๋‹ค.

๋‚ด ๋จธ๋ฆฌ์—์„œ ์ค„ ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” ๋™์ผํ•œ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” Jest์ž…๋‹ˆ๋‹ค. https://jestjs.io/docs/en/configuration#rootdir -string. AFAIK Jest๋Š” rootDir ์™ธ๋ถ€์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์—์„œ๋„ ๋™์ผํ•œ ๋™์ž‘์„ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ๋Š” ํ•ญ์ƒ ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊ฐœ์„ ์„ ๊ณ ๋ คํ•˜๊ณ  ๊ณ„์‹œ๋‹ค๋‹ˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค. @MicahZoltu ์˜ ์ œ์•ˆ์€ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด

๊ฒฐ๊ตญ rootDir ๊ฐ€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋‹ค์‹œ ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(๋”ฐ๋ผ์„œ ์‚ฌ๋žŒ๋“ค์˜ ๋ฐ˜์‘), ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ ํ•ด๋‹น ์˜ต์…˜์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๊ณ ๋ คํ•  ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋Š” ์ ˆ์ถฉ์•ˆ ์ค‘ ํ•˜๋‚˜๋Š” rootDir ์ด๋ฆ„์„ ๋” ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. outBaseDir ๊ฐ€ ํ›„๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋งˆ ๋” ์ข‹์€ ์ด๋ฆ„์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ๋žŒ๋“ค์„ ๋ฐ”๋ณด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์•”์‹œํ•˜๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋” ์ด์ƒ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

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

@ngryman rootDir ์˜ ์ •์˜์™€ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. tsc --init ๋ฅผ ํ†ตํ•ด ์ƒˆ ts ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ tsconfig.json ๋Œ€ํ•œ rootDir tsconfig.json ์˜ ์ฃผ์„์€ /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ ์ธ์šฉํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. _input_ ํŒŒ์ผ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์ž…๋ ฅ์˜ ์ •์˜์— ๋”ฐ๋ผ ์ปดํŒŒ์ผ์„ ๊ณ ๋ คํ•˜๋Š” ์œ ์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

@RyanCavanaugh 4๋…„ ์ „ typescript๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ๋˜์—ˆ์„ ๋•Œ ์ด์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด์—ˆ์„ ts-node ์™€ ๊ฐ™์€ typescript ์‹คํ–‰์˜ ์ธ๊ธฐ๋กœ ์ธํ•ด tsc๊ฐ€ ์•ฝ๊ฐ„ ์งˆํˆฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  rootDir ์™ธ๋ถ€์˜ typescript ํŒŒ์ผ์ด ์ž˜๋ชป๋œ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์„ ์•”์‹œํ•œ๋‹ค๋Š” ์ƒ๊ฐ์€ ๋‹จ์ˆœํžˆ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ts-node ๋Š” ๋” ๋น ๋ฅด๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@CodySchrank์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. rootDir ๋‚ด๋ถ€์˜ ์ผ๋ถ€ ์†Œ์Šค ํŒŒ์ผ์ด ์™ธ๋ถ€ ํŒŒ์ผ์„ ์ฐธ์กฐ/๊ฐ€์ ธ์˜ฌ ๋•Œ TS ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ TypeScript ์ž์ฒด๊ฐ€ rootDir ์™ธ๋ถ€์˜ ๊ด€๋ จ ์—†๋Š” ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์€ jest ๋˜๋Š” ๊ธฐํƒ€ ๋„๊ตฌ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์ผ ๋ฟ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ์š”์ ์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ๋“ค์€ ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ถ€๋„ ์•„๋‹ˆ๋ฉฐ ์–ด๋””์—์„œ ์ง์ ‘ ์ฐธ์กฐ/๊ฐ€์ ธ์˜ค๊ธฐ๋„ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ง™์†Œ์‚ฌ, ์ฒ˜์Œ์— ๊ฒฐ๊ณผ ๋นŒ๋“œ์— ๋ฒˆ๋“ค๋กœ ํฌํ•จ๋˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

src / test / out ์„ค์ •์€ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์—์„œ ํ•ด๊ฒฐํ•œ ์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค์˜€์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ฐ ๋ฃจํŠธ ํด๋”(https://www.typescriptlang.org/docs/handbook/project-references.html)์— ๋Œ€ํ•ด ์ตœ์†Œํ•œ ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€์นจ์„ ์ฝ๊ณ  ๋‚˜์„œ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ์ž๋ฆฌ๋ฅผ ๋– ๋‚ฌ๊ณ , ์ œ๊ฐ€ ์š”์ฒญํ•œ ๊ฒƒ์ด ํŒŒ๋ฆฌ์ฑ„์˜€์„ ๋•Œ ์ฐฉ์•”๊ธฐ๋ฅผ ๊ฑด๋„ค์ฃผ๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์ด ๊ธฐ๋Šฅ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐœ๋ฐœ์ž์˜ ์˜๋„๊ฐ€ ์†์ƒ๋˜์—ˆ๋‹ค๋Š” ๊ฐ€์ • ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ "outDir" ๋ฅผ ./src ๋กœ ์„ค์ •ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ./test ์—์„œ TS ํŒŒ์ผ์„ ์ฐพ์œผ๋ฉด ์ด ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ • _ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  "outDir"์˜ ์–ด๋–ค ํŒŒ์ผ์—์„œ๋„ ์ฐธ์กฐ๋˜์ง€ ์•Š์Œ).

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

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

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

๋ฌผ๋ก  ์งœ์ฆ๋‚œ ์†๋‹˜๋“ค์€ ๋Œ์•„์„œ์„œ ํ•ซ๋„๊ทธ ํŒ๋งค๋Œ€์—์„œ๋Š” ํ•ซ๋„๊ทธ๋ฅผ ํŒ”์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ณผ๊ฐํ•˜๊ฒŒ ์•Œ๋ฆฌ๋Š” ํฐ ๊ฐ„ํŒ์„ ๋ดค์–ด์•ผ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜ผ๋ž€์ด ๋ˆ„์ ๋จ์— ๋”ฐ๋ผ ํ•ซ๋„๊ทธ ๊ฐ€ํŒ๋Œ€์˜ ์†Œ์œ ์ž๋Š” ์ œํ’ˆ์˜ ๊ธฐ๋Šฅ์„ ๊ณ ๊ฐ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ , ์ด๊ฒƒ์„ ๋” ๊ณ ๋ คํ•˜๋ฉด ์ด ๋ฌธ์ œ์˜ ๊ธฐ์ €์— ์žˆ๋Š” ํ•ต์‹ฌ ํŒ€์˜ ์ผ๋ถ€์— ์ผ์ข…์˜ ๋ถˆ๋ณ€์„ฑ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์œผ๋ฉด ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

๋„๊ตฌ์— ์ œ๊ณต๋œ ์ž…๋ ฅ ํŒŒ์ผ์„ ์•”์‹œ์ ์œผ๋กœ ํฌํ•จํ•˜์ง€ ์•Š์Œ

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


/project/source/index.ts

import '../external.ts'

/project/tsconfig.json

{
  "compilerOptions": {
    "rootDir": "./source"
  }
}

์ด ์˜ˆ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ "์†Œ์Šค ํŒŒ์ผ์€ '์†Œ์Šค' ๋””๋ ‰ํ† ๋ฆฌ์—๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์— _not_ ์žˆ๋Š” ํŒŒ์ผ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. TypeScript์—๋Š” ์ด์ œ ๋‘ ๊ฐœ์˜ ์ถฉ๋Œํ•˜๋Š” ๋ช…๋ น์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ๋งŒ ์ปดํŒŒ์ผํ•˜๋ผ๋Š” ๊ฒƒ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ ์™ธ๋ถ€์˜ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@MattiasMartens ๋‹น์‹ ์€ ์•”์‹œ ์ ์œผ๋กœ include ๋ฐ rootDir ๋ณ‘ํ•ฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. /src ๋ฐ /test ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ include ๊ฐ€ src/* ์ด๋ฉด /test ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. src ์—์„œ test ์—์„œ ํ•ญ๋ชฉ์„ ์ž˜๋ชป ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

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


์–ด์จŒ๋“ !

rootDir ์˜ ์ •์˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉด TypeScript๊ฐ€ ์ œ๊ณต๋œ rootDir ์™ธ๋ถ€์˜ ํŒŒ์ผ์„ ๋ณผ ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

@MattiasMartens ๋‹น์‹ ์€ ์•”์‹œ ์ ์œผ๋กœ include ๋ฐ rootDir ๋ณ‘ํ•ฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. /src ๋ฐ /test ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ include ๊ฐ€ src/* ์ด๋ฉด /test ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. src ์—์„œ test ์—์„œ ํ•ญ๋ชฉ์„ ์ž˜๋ชป ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ปดํŒŒ์ผ ์‹œ ์œ ํšจ์„ฑ ์ด ๋‚ด๋ณด๋‚ด ์ง€์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Š” include ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ณ„๋„์˜ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์˜คํ•ดํ•˜๋Š” ๋ฐ์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ์ฃผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” _์˜ตํŠธ์ธ ์‹œํ–‰ ํ™•์ธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ์˜ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•œ๋‹ค. rootDir ์˜ตํŠธ์ธ ์‹œํ–‰ ํ™•์ธ์„ ๊ณ ๋ คํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๊ฒฐ๊ตญ ๋ฐฉ์ถœ๋˜๋Š” ๊ฒƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ๋ถ„๋ช…ํžˆ ์‹œํ–‰ ํ™•์ธ์ด _์œ ์ผํ•œ_ ์•„๋‹™๋‹ˆ๋‹ค.

target ์™€ ๊ฐ™์€ ์ผ๋ถ€ ํ”Œ๋ž˜๊ทธ๋Š” ๋ฐฉ์ถœ๋˜๋Š” ๋‚ด์šฉ์„ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹œํ–‰ ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ ๋ช…๋ น์ž…๋‹ˆ๋‹ค. rootDir ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ช…๋ น์ฒ˜๋Ÿผ ์ฝ๊ณ  ๋ฌธ์„œํ™”๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” _์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋‚ด๋ณด๋ƒ„_์ด ๊ธฐ๋ณธ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฐœ๋…์— ๊ฐ•๋ ฅํžˆ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ์ฝ์€ ๋‚ด์šฉ์—์„œ rootDir ๋‚ด๋ถ€์˜ ํŒŒ์ผ ์—์„œ rootDir ์™ธ๋ถ€์˜ ํŒŒ์ผ๋กœ์˜ ์ฐธ์กฐ๋Š” _์˜ค๋ฅ˜์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ํ•ฉ์˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‹ค๋ง ์Šค๋Ÿฌ์› ๋˜ ๊ธฐ๋Šฅ์˜ ์ธก๋ฉด์€ ๊ฑฐ๊ธฐ์—์„œ ๊ทธ์น˜์ง€ ์•Š์ง€๋งŒ ์‹ค์ œ๋กœ rootDir ์™ธ๋ถ€์˜ ํ”„๋กœ์ ํŠธ ํด๋”์—์„œ TS ํŒŒ์ผ ์„ ์ฐพ์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค rootDir ์ˆ˜์ž… ์—ฌ๋ถ€.

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

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

์ •์˜๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ •์˜๋Š” ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ๊ธฐ๋Šฅ๋งŒ ์œ ์ง€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ธฐ๋Šฅ ์š”์ฒญ์ด rootDir ์™ธ๋ถ€์—์„œ ๋ฐœ๊ฒฌ๋œ .ts ํŒŒ์ผ์„ .d.ts ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด

๋‚˜๋Š”... rootDir ๋ฌด์–ธ๊ฐ€๊ฐ€ ์™ธ๋ถ€์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™์€ ์ด์œ ๋กœ ๊ทธ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. rootDir ์˜ ๋‚ด์šฉ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์ฃผ๋ณ€ ์ฝ”๋“œ์—์„œ ์บก์Šํ™”ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜์ง€ ์•Š๋Š” ๋™์ž‘์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์•”์‹œ ์ ์œผ๋กœ ์™ธ๋ถ€์˜ ํŒŒ์ผ์„ ์ œ์™ธ ํ•  ์ƒ๊ฐ rootDir ์—์žˆ๋Š” ํŒŒ์ผ ๊ฒฝ์šฐ rootDir ๊ทธ๋“ค์—๊ฒŒ ์ฐธ์กฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—์žˆ๋Š” ํŒŒ์ผ ๊ฒฝ์šฐ rootDir ๊ทธ๋“ค์—๊ฒŒ ์ฐธ์กฐ ํ• ์ด ํ˜„์žฌ์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

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

include ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •๋˜์ง€ ์•Š๊ณ  ํฌํ•จ๋œ ํŒŒ์ผ์ด rootDir ์™ธ๋ถ€์— ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ์˜ค๋ฅ˜๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

"tests/foo.ts" ํŒŒ์ผ์ด rootDir 'rc' ์™ธ๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค. "ํฌํ•จ" ํŒจํ„ด์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์œผ์…จ์Šต๋‹ˆ๊นŒ?

๊ธฐ๋ก #33515

https://github.com/microsoft/TypeScript/issues/31757#event -2480427393์—์„œ๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

rootDir, ํฌํ•จ ๋ฐ ์ œ์™ธ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์€ ๋„ˆ๋ฌด ์ด์ƒํ•˜๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ•ญ์ƒ rootDir์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๊ณ  rootDir์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ํด๋”(์˜ˆ: ๊ณต๊ธ‰์—…์ฒด ํด๋”)๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋”๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ •์˜๋Š” ์ง€์˜ฅ์ฒ˜๋Ÿผ ์ด์ƒํ•˜๊ณ  ๋งค์šฐ ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ฒƒ์€ ์ƒํ˜ธ ์ž‘์šฉ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค . ์„ค์ •์€ ์„œ๋กœ ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. include ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด์šฉ์„ 100% ์ œ์–ดํ•˜๊ณ  rootDir ๋Š” outDir ์˜ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์„ 100% ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์€ ๋‚ด ํด๋” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

tsconfig.json
package.json
src/index.ts

๋‚ด tsconfig์— ์žˆ์Šต๋‹ˆ๋‹ค.

"rootDir": "src",
"outDir": "lib",

๊ทธ๋ฆฌ๊ณ  ๋‚ด "index.ts"(src ํด๋”)

import pkg from '../package.json'; // I read the package.json object

export class SomeClass {
  public version = pkg.version;
}

๋‚˜๋Š” ๋นŒ๋“œ ํ›„์— "index.js" ํŒŒ์ผ์ด "lib" ํด๋” ์•ˆ์— ์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ _์•Œ๊ณ _ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” package.json์ด 1๋‹จ๊ณ„ ์˜ฌ๋ผ๊ฐˆ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ _์•Œ๊ณ _ ์žˆ์Šต๋‹ˆ๋‹ค.
Typescript๊ฐ€ ๋‚ด ํด๋” ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ณด๋‹ค ๋” ์ž˜ ์•Œ๊ณ  ๋นŒ๋“œ๋ฅผ ์ค‘๋‹จํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ ํด๋”์— ํฌํ•จ๋˜์ง€ ์•Š์€ rootDir ํด๋” ์™ธ๋ถ€์˜ ์ผ๋ถ€ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@sebelga ์•„๋งˆ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ ํ•˜๋Š”๋ฐ์š” - ์ˆ˜ .json ์—์„œ ์™ธ๋ถ€ rootDir TS๊ฐ€ ์ถœ๋ ฅ ํด๋”์— ๊ทธ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธ ๋  ๊ฒƒ

@sebelga ๋‚˜๋Š” ์•„๋งˆ๋„ ๋ฒ„๊ทธ - TS๊ฐ€ ์ถœ๋ ฅ ํด๋”์— ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€ rootDir์—์„œ .json์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด

์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.. ์šฐ๋ฆฌ๋Š” .json ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๋Š” ๋ช‡ ๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค... ํŒŒ์ผ์ด ๊ฐ™์€ ์œ„์น˜์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋‚ด๋ณด๋‚ด์งˆ ์˜ˆ์ •์ด๋ผ๋ฉด ํŒŒ์ผ๋งŒ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋ฐฉ์ถœ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: --outDir๊ฐ€ ์ง€์ •๋˜๋ฉด ํ•ด๋‹น ํด๋”๋กœ ๋ฐฉ์ถœ๋ฉ๋‹ˆ๋‹ค)

@RyanCavanaugh ๋Ÿฐํƒ€์ž„์— package.json ์—์„œ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ console.log ์ถœ๋ ฅํ•˜๋ ค๋Š” @sebelga ์™€ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด ์†”๋ฃจ์…˜์€ ๋‚ด "rootDir": "." ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์—ฌ๊ธฐ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

"include": [
    "src",
    "typings"
  ]

๊ทธ๋ฆฌ๊ณ  package.json ํŒŒ์ผ์ด lib (๋นŒ๋“œ) ํด๋”์— ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์ด ํด๋”์—๋Š” "src" ํ•˜์œ„ ํด๋”๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋นŒ๋“œ ์งํ›„์— ์‹คํ–‰๋˜๋Š” bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

#!/bin/bash

rm lib/package.json
mv $(pwd)/lib/src/* $(pwd)/lib
rm -rf lib/src

๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‚˜์—๊ฒŒ ๊ฝค ํ•ดํ‚น ๋œ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค.

@sebelga typings ํด๋”์— .ts ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ rootDir ๋ฅผ src ํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฒ•์ ์ž…๋‹ˆ๋‹ค.

@sebelga const { version } require('../../package.json') ๋˜๋Š” import { version } from 'package.json') ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ๋„ํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

import { sync as loadJsonFileSync } from 'load-json-file';

const { version } = loadJsonFileSync('../../package.json');

TypeScript๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ rootDir ์™ธ๋ถ€์— ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/sindresorhus/load-json-file

๋ชจ๋“  ../.. ๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/sindresorhus/read-pkg-up

@RyanCavanaugh ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ "src"๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. src( import pkg from '../package.json'; ) ์™ธ๋ถ€์—์„œ "package.json"์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋Š”๋ฐ tsc๋Š” ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dylang ์„ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ ํ•  ๊ฒƒ์ด๋‹ค.

๋‚ด ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ํŠน์ • ํด๋”(rootDir๋ฅผ ํ†ตํ•ด)์— ์žˆ๋‹ค๊ณ  typescript์— ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ rootDir ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค! rootDir ๋Š” "์ด ํด๋”๋ฅผ outDir ์˜ ๊ฒฝ๋กœ ๊ณ„์‚ฐ์„ ์œ„ํ•œ ์ƒ๋Œ€์  ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. _์ปดํŒŒ์ผ์˜ ์ผ๋ถ€์ธ ํŒŒ์ผ_์€ files ๋ฐ/๋˜๋Š” include / exclude ๋กœ ๋‹ต๋ณ€๋˜๋Š” ๋ณ„๋„์˜ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh ํ•˜์ง€๋งŒ rootDir ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ์ด๊ฒƒ์ด๊ณ  ์ด๊ฒƒ์ด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋Š” ์ƒˆ๋กœ์šด "compilerOption"์„ ๋„์ž…ํ•จ์œผ๋กœ์จ ๊ธฐ์กด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ์•„๋งˆ๋„ ๋งค์šฐ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋Š” 2016๋…„ ์ดํ›„์— ์—ด๋ฆฐ ๋ฌธ์ œ๋ฅผ ๋ณผ ๋•Œ ํ‰์ •์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋Šฅ์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ.

์ด์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ข‹์€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด์ฉ” ์ˆ˜ ์—†์ง€๋งŒ ๊ฐ€๋” ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. TypeScript ์ž‘์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ„๋‹จํ•œ ๊ตฌ์„ฑ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด๊ฐ€์š”?

๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฒŒ์œผ๋ฅด๊ฑฐ๋‚˜ ๋„์›€์„ ์ค„ ์˜์‚ฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜ ๋ง๊ณ ๋Š” ์—ฌ๊ธฐ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ๋‚˜์œ ์‚ฌ๋žŒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

์†์„ฑ "rootDir"์˜ ์ •์˜๋กœ ๋ณด์ด๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ˆ˜๋…„ ๋™์•ˆ ๊ณ„์†๋˜์–ด์˜จ ์ด ๊ฐˆ๋“ฑ, ์ด ๋…ผ์Ÿ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

์‚ฌ๋žŒ๋“ค์€ ์ž์‹ ์ด ์˜ณ๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋…ผ์Ÿ์— ํœ˜๋ง๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ, "rootDir"์€ ์†Œ์Šค ์ฝ”๋“œ์˜ ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์˜ค๋ฅ˜๊ฐ€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

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

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

ํ•จ๊ป˜ ํ˜‘๋ ฅํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ € ๋นจ๊ฐ„์„ ์ด ์‚ฌ๋ผ์ง€๋Š” ๊ฑธ ๋ณด๋ฉด ๋„ˆ๋ฌด ํ–‰๋ณตํ•  ๊ฒƒ ๊ฐ™์•„์š”...

@nullquery tsc ์ž‘๋™ํ•˜์ง€๋งŒ IDE์— ๋นจ๊ฐ„์ƒ‰ ๋ฌผ๊ฒฐ์„ ์ด ํ‘œ์‹œ ๋˜๋ฉด IDE๊ฐ€ tsc ์™€ ๋™์ผํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „ ๋˜๋Š” ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

@nullquery ๋Š” ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฒ„๊ทธ๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์˜ ๋ฌธ์ œ๋ฅผ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@sebelga ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ์ด์–ด npm ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐ ์ ํ•ฉํ•œ ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

tsc --module commonjs --target ESNext --outDir ./edition-esnext --project tsconfig.json && test -d edition-esnext/source && ( mv edition-esnext/source edition-temp && rm -Rf edition-esnext && mv edition-temp edition-esnext ) || true

์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ ์˜ˆ.

๊ฒฝ๊ณ„๊ฐ€ ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์€ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด "tsconfig.json" ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๊ณ  ์ด๊ฒƒ์„ ํŒŒ์ผ ๋์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค("compilerOptions" ์™ธ๋ถ€):

"references": [
    { "path": "../common" }
]

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด "../common/" ํด๋”(๋ฐ ๋ชจ๋“  ํ•˜์œ„ ํด๋”)์˜ ํŒŒ์ผ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด์ „์˜ ํ˜ผ๋ž€์€ IntelliJ์™€ ์˜ค์—ผ๋˜์ง€ ์•Š์€ gulp-typescript ์ž‘์—…์ด ๋™์ผํ•œ "tsconfig.json" ํŒŒ์ผ์„ ์‚ฌ์šฉํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์—์„œ ๋น„๋กฏ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์ด์œ ์—์„œ์ธ์ง€ "gulp-typescript"๋Š” ์ปดํŒŒ์ผ์— ์ตœ์„ ์„ ๋‹คํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

TypeScript์˜ ์˜ค๋ฅ˜(์˜ˆ: let z: number = '' )๋Š” IntelliJ์—์„œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€๋งŒ "gulp-typescript"๋Š” ์ด๋ฅผ ์ œ๋Œ€๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
JavaScript ๊ตฌ๋ฌธ ์˜ค๋ฅ˜(์˜ˆ: let 1z = '' )๋งŒ "gulp-typescript"์— ์˜ํ•ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ "gulp-typescript" ์‚ฌ์šฉ์ž์ธ ๊ฒฝ์šฐ "gulp-typescript" ๋ฒ„์ „ ๋ฐ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ฏธ๋ž˜์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„ ์ฝ์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๋” ๋‚˜์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.)


๋‚˜๋Š” ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์˜ ์‚ฌ์šฉ์ด ์ด ๋ˆˆ๋ถ€์‹  ์‘๋‹ต์˜ ์–ด๋”˜๊ฐ€์— ๋ฌปํ˜€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์ด๊ฒƒ์ด ๋” ์ž˜ ๋ฌธ์„œํ™”๋˜์—ˆ๋‹ค๋ฉด ๋” ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Google์—์„œ "TS6059"์— ๋Œ€ํ•œ ์ƒ์œ„ 3๊ฐœ ๊ฒฐ๊ณผ๋Š” ๋ชจ๋‘ GitHub ๋ฌธ์ œ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜์™€ ํ•ด๋‹น ์†”๋ฃจ์…˜์„ ๋ฌธ์„œํ™”ํ•œ ํŽ˜์ด์ง€๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@MicahZoltu ์ด๊ฒƒ์ด ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๊นŒ? ์ƒˆ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋‚˜์š”, ์•„๋‹ˆ๋ฉด ์ฃผ์š” ๊ธฐ์—ฌ์ž ๊ฐ„์— ๋‚ด๋ถ€์ ์œผ๋กœ ๋…ผ์˜๋œ๋‹ค๋ฉด ๋” ๋นจ๋ฆฌ ์ง„ํ–‰๋ ๊นŒ์š”?

(FWIW ์ €๋Š” TypeScript ํŒ€์˜ ์ผ์›์ด ์•„๋‹™๋‹ˆ๋‹ค)

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

gulp-typescript์˜ ๊ฒฝ์šฐ gulp-typescript์—์„œ ์‚ฌ์šฉํ•˜๋Š” TSC ๋ฒ„์ „์ด IntelliJ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ TSC ๋ฒ„์ „๊ณผ ๋‹ค๋ฅธ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ฆ์ƒ์ด ๋‚˜ํƒ€๋‚˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋™์ผํ•œ tsconfig.json ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค).

"gulp-typescript"์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „์€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒ„์ „ ๋ชจ๋‘ node_modules ์—์„œ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ์ด์™€ ๊ด€๋ จ๋œ ์„ค์ •์„ ์ˆ˜์ •ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค("gulp-typescript"์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ "๋ฆฌํฌํ„ฐ"๋ฅผ ์–ด์ง€๋Ÿฝํžˆ๊ณ  ๋” โ€‹โ€‹๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์„ค์ •์„ ์žฌ์ •์˜ํ•˜๋ ค๋Š” ์‹œ๋„ ํฌํ•จ). ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. IntelliJ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•œ Gulp ์ž‘์—…์ด ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ๊บผ์ด ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค.


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

๋‚˜๋Š” "๋ ˆ๊ฑฐ์‹œ ์ด์œ ๋กœ ํ˜ธํ™˜์„ฑ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ"์„ ๋ฏฟ์ง€ ์•Š์œผ๋ฉฐ ํŠนํžˆ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ์™€ ๊ด€๋ จํ•˜์—ฌ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. rootDir ์™ธ๋ถ€์˜ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด _๋ฐ˜๋“œ์‹œ_ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ท€ํ•˜์™€ ๊ท€ํ•˜์˜ ํŒ€์ด ์ดํ•ดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ์ž์œ ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


TypeScript๋กœ ์ฒ˜์Œ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋งŽ์€ ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘:

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

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

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

๊ฒฐ๊ตญ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜๋งŒ์˜ Gulpfile์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

  • ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณ„๋„์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋กœ์ปฌ "tsconfig.json" ํŒŒ์ผ์— ๋”ฐ๋ผ TypeScript๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค( outDir ). (ํ•˜ํ•˜ํ•˜ํ•˜!) ๊ทธ๋Ÿฐ ๋‹ค์Œ "๋กค์—…" ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํŒŒ์ผ์„ ๋‹จ์ผ JavaScript ํŒŒ์ผ๋กœ ์••์ถ•ํ•œ ๋‹ค์Œ UglifyJS๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ด ํŒŒ์ผ์„ ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์ž‘์—…์€ ์›๋ณธ TypeScript ํŒŒ์ผ์— ๋‹ค์‹œ ๋งคํ•‘๋˜๋Š” ์†Œ์Šค ๋งคํ•‘์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • (์‚ฌ์šฉ์ž ์ •์˜ ์ž‘์—…) TypeScript ์†Œ์Šค ๋ฃจํŠธ์˜ ๊ฐ HTML ํŒŒ์ผ์— ๋Œ€ํ•ด html_templates ๋ผ๋Š” ์‚ฌ์ „์„ ํฌํ•จํ•˜๋Š” JavaScript ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์ถ•์†Œ๋œ JavaScript ํŒŒ์ผ๋กœ ๋‚ด webroot ํด๋”์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋” ์šฐ์•„ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•˜๋‚˜์˜ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋กœ ๋„˜์–ด๊ฐ„ ํ›„์—๋Š” ๊ฐ๊ฐ์ด ์ œ๊ณตํ•˜๋Š” ์†”๋ฃจ์…˜ ์‚ฌ์ด์—์„œ ์ถฉ๋ถ„ํžˆ ์ €๊ธ€๋ง์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์„ ํƒํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํšจ๊ณผ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ดํ•ดํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๊ฐ„๋‹จํ•˜๋ฉฐ(ํŠนํžˆ "gulp-typescript"๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—) ์•ž์œผ๋กœ ๋ช‡ ๋…„ ๋™์•ˆ ์ด๊ฒƒ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์ž์‹ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ๋„์šฐ๋ ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์ง€๋งŒ(๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ํ˜ผ๋ž€์ด ์•„๋‹ˆ๋ผ ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค) _any_ ์†”๋ฃจ์…˜์—๋Š” ํ•ญ์ƒ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์‹ ๋…, ์„ฑ์  ์ทจํ–ฅ ๋ฐ ์„ฑ๋ณ„ ์ •์ฒด์„ฑ์„ ๊ฐ€์ง„ ๋‹ค๋ฌธํ™” ํŒ€ ์ด ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


tl;dr ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ์ค‘๋‹จํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚ด ๋„๊ตฌ๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”

๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ TS ์„ค์ •์„ ์ œ๋Œ€๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ํฌ๊ธฐํ•˜๊ณ  ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ tsc -w ํ•˜๊ณ  npm link ํ•˜๋ฉด ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ tsconfig์˜ ๋ชจ๋“  ๋ณต์žก์„ฑ์„ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. node_modules ์˜ ์ผ๋ฐ˜ node.js ์ข…์†์„ฑ๊ณผ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋Š˜ ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋Œ€์ƒ์„ es5 ์—์„œ es6 ํ–ˆ์œผ๋ฉฐ File '.../lib.ts' is not under 'rootDir' ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ๊ตฌ์กฐ:

/app
 - tsconfig.json // rootDir = "."
 - app.ts (

/app/node_modules/lib
 - tsconfig.json // rootDir = "."
 - lib.ts
 - lib.js
 - lib.d.ts

์™œ tsc ์—์„œ /app ์— ๋Œ€ํ•œ ์—ผ๋ ค /app/node_modules/lib/lib.ts ํŒŒ์ผ? ํ•ด๋‹น ํŒŒ์ผ์„ ์ „ํ˜€ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ /app/node_modules/lib/lib.js ๋ฐ /app/node_modules/lib/lib.d.ts ์žˆ์Šต๋‹ˆ๋‹ค.

/app/node_modules/lib/lib.ts ์‚ญ์ œ๋˜๋ฉด - ๋†€๋ž๊ฒŒ๋„ - ์ž˜ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

@alexeypetrushin ๋‚ด ํ”„๋กœ์ ํŠธ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ:

import * as pkg from '../package.json';

์•„๋‹ˆ์š”. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜์žˆ๋Š”์ด ์˜ค๋ฅ˜๋ฅผ ๋Œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

@SephReed : ์ €๋Š” StackOverflow์—์„œ 200๋ ™ ํฌ์ธํŠธ๋ฅผ ์ผ๊ณ  ๋ˆ„๊ตฐ๊ฐ€ ../package.json ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์œ„ํ•œ ์ด ๋‹น์‹ ์ดํ•ด์•ผ ํ•  ๊ณณ์ž…๋‹ˆ๋‹ค typings.d.ts ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ์— ํŒŒ์ผ์„ package.json ์ด ๋‚ด์šฉ์œผ๋กœ, :

declare module '*.json';

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

์ด๊ฒŒ ์ด๋ ‡๊ฒŒ ์—ด๋ค ํ† ๋ก ์ด๋ผ๋‹ˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋…ผ๋ฆฌ๋Š” ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ๋ฌผ๋ก  ์†Œ์Šค ํด๋”๊ฐ€ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ์„ ์œ„ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์œ ํ˜• ์ง€์›์„ ํ™•์‹คํžˆ ํฌํ•จํ•˜๋Š” ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋„ ํ•ด๋‹น ํด๋” ์™ธ๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ ์ตœ๊ณ ์˜ IntelliSense๋Š” TypeScript์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

repo/
โŠข config/  << provide TS support, but don't build this directory
  โจฝ webpack.config.ts 
โŠข scripts/  << provide TS support, but don't build this directory
  โจฝ release.ts
โŠข src/        << build this directory
  โจฝ example.ts
โจฝ tsconfig.json

๋‚ด๊ฐ€ ์‚ฌ์šฉ ๊ทธ๋ž˜์„œ "rootDir": "src" ํ™•์ธ ํŒŒ์ผ์— ์ง€์‹œ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ dist ํ•˜์ง€ dist/src . ๋ฌผ๋ก  TypeScript๋Š” ์ด ์„ค์ •์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ Webpack์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋งˆ์นจ๋‚ด ๊ทธ๊ฒƒ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋ฉ˜ํŠธ ์—†์ด ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ •ํ™•ํžˆ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์œผ๋กœ ์‘์›ํ•ฉ๋‹ˆ๋‹ค.

"files", "include", "exclude"์™€ ๊ฐ™์ด tsc๊ฐ€ ์ปดํŒŒ์ผ์„ ๊ณ ๋ คํ•  ํด๋”์™€ ํŒŒ์ผ์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜.

๊ทธ๋ ‡๋‹ค๋ฉด "rootDir"์€ ๋ฌด์—‡์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?
rootDir์€ ์†Œ์Šค ํŒŒ์ผ์— ๋Œ€ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ(๊ณ„์ธต ๊ตฌ์กฐ)์˜ ๋ฃจํŠธ์ด๋ฉฐ, tsconfig.json ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ์ง€์ •๋œ ๊ฒฝ์šฐ "outDir"์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐ tsc๊ฐ€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ tsc๊ฐ€ "outDir"์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. "outDir"์€ tsc๊ฐ€ ์ถœ๋ ฅ ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๋Š” ๋ฃจํŠธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด Java ํ”„๋กœ์ ํŠธ์— ์ด ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

- src
  - main
    - java
    - resources
      - static
        - js
        - ts
          test.ts

"include"์™€ "rootDir"์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด tsc๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

"include": "src/main/resources/static/ts" *
"rootDir": "." *

- src
  - main
    - java
    - resources
      - static
        - js
        - ts
          test.js *
          test.ts

"outDir"๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด tsc๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

"include": "src/main/resources/static/ts"
"rootDir": "."
"outDir": "build" *

- build
  - src
    - main
      - resources
        - static
          - ts
            test.js *
- src
  - main
    - java
    - resources
      - static
        - js
        - ts
          test.ts

์•„๋งˆ๋„ "rootDir" ์˜ต์…˜์„ ์„ค์ •ํ•˜๊ณ  "outDir" ์˜ต์…˜์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์—ฌ ์ด๊ฒƒ์„ ๊ฐ–๊ณ  ์‹ถ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"include": "src/main/resources/static/ts"
"rootDir": "src/main/resources/static/ts" *
"outDir": "src/main/resources/static/js" *

- src
  - main
    - java
    - resources
      - static
        - js
          test.js *
        - ts
          test.ts

๋”ฐ๋ผ์„œ "exclude" ์˜ต์…˜์„ ์ œ์™ธํ•˜๊ณ  ํŒŒ์ผ์˜ ๋ฒ”์œ„๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” "rootDir" ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด "rootDir" ์˜ต์…˜์˜ ๋ชฉ์ ์— ๋งž์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— tsc๊ฐ€ ๋นŒ๋“œ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ๋‚˜์œ ๋ช…๋ช… ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค. "rootOfStructureOfInputs"๋‚˜ ๊ทธ ๋ฐ–์˜ ๊ฒƒ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ "outDir"์€ "rootOfOutputs"์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SS์—์„œ ๋ณด๋Š” ๊ฒƒ์€ WebStorm ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ TS DevServer์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ๋กœ ๊ถŒ์žฅ๋˜๋Š” ์ˆ˜์ž…ํ’ˆ์€ ์“ฐ๋ ˆ๊ธฐ์ž…๋‹ˆ๋‹ค. "ํ†ต์‹ " ์†Œ์Šค ํด๋”์—์„œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋„๋Œ€์ฒด ๋ˆ„๊ฐ€ ๊ทธ๊ฑธ ์›ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋ฉด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์‹œ๋„ํ–ˆ๋‹ค :

"exclude": ["lib", "node_modules",
        "..", "../..", "../../..", "../../../..", "../../../../..", "../../../../../.."
    ]

๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค

Bildschirmfoto 2020-07-22 um 10 08 28

@mhegazy ์ด ๋ฌธ์ œ์— "์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™"์ด๋ผ๋Š” ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ–ˆ์ง€๋งŒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ์Šคํฌ๋ฆฐ์ƒท์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด tsc-server๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ์ œ์•ˆ์œผ๋กœ ๋‚ด rootDir(์ด ๊ฒฝ์šฐ mobiservice/src) ์™ธ๋ถ€์˜ ํŒŒ์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ณด๊ธฐ์—” ๋ฒ„๊ทธ ๊ฐ™๋„ค์š”...

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