@nycdotnet ์
์ฌ๊ธฐ์์ ์ ์์ ๊ณต๋ฃก์ด ๋ถํ๋ ์ง๊ตฌ๋ฅผ ๊ฑธ์๋ ์ ์ฌ ์๋(์ฌ์ง์ด #11 ์ด์ )์ ์ฒ์ ์์๋์์ต๋๋ค. ์ด ์ ์์ ์ด๋ค ๊ฒ๋ ์ฐธ์ ํ์ง ์์ง๋ง ๊ทธ ์์ฒด๋ก ๋ฌธ์ ๋ฅผ ๋ค๋ฃฐ ๋๊ฐ ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. Steve์ ์ ์์ #3394์ ๋๋ค.
ํ์ฌ TypeScript์์๋ ์์ํ๊ณ ์์ํ๋ ๊ฒ์ด ๋ค์ ์ฝ๊ณ ๋งค์ผ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ์์ต๋๋ค(#2338 ๋ฐ System.js ์์ ์ ๋์์ผ๋ก). ์ด๊ฒ์ ํ๋ฅญํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ์ฝ๊ฐ์ ์ฅ์ ๋ฌผ์ด ์์ต๋๋ค. ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๋ฉํ ๋ชจ๋ธ์ด ์์ต๋๋ค.
์๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ 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์ด ํฌํจ๋ ์ฌ๋ฐ๋ฅธ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ด์ด์ผ ํฉ๋๋ค. ์ด๋ ์ข ์์ฑ์ด ์ํ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ์ํ ์ข ์์ฑ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ์ ์์ง๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์ฆ ์ํ ์ข ์์ฑ์ด ์๋ ์ ํ์ด ์๋ ๊ฒฝ์ฐ ์ ์ฒด ํด๊ฒฐ์ ์ํํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ์ ์์ต๋๋ค.
์ข ์์ฑ์ '์ข ์์ฑ' ์น์ ์ ๋์ด๋ ์์๋๋ก ๋จผ์ ๋น๋๋ฉ๋๋ค. ์ข ์์ฑ ๋น๋์ ์คํจํ๋ฉด ์ปดํ์ผ๋ฌ๋ ์ค๋ฅ์ ํจ๊ป ์ข ๋ฃ๋๊ณ ํ๋ก์ ํธ์ ๋๋จธ์ง ๋ถ๋ถ์ ๊ณ์ ๋น๋ํ์ง ์์ต๋๋ค.
๊ฐ ์ข ์์ฑ์ด ์๋ฃ๋๋ฉด ์ถ๋ ฅ์ ๋ํ๋ด๋ '.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์ด ์๋ ์ข ์์ฑ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋์ ์ค๋ฅ ์ฌ๋ก๋ก ๊ธฐ๋ณธ 'ํ์ผ'๊ณผ ํ์ฌ ํ๋ก์ ํธ์ ์ค์ ์ ํด๋น ์ข ์์ฑ์ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ง์์ฌ!
:+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์ ๋๋ฌด ์ปค์ ๋ง์กฑํ์ง ์์ต๋๋ค.
๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค, ๋ชจํ๋ฉ๋. ๋ด๊ฐ ์ดํดํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ค์ ๋งํ๊ฒ ์ต๋๋ค.
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"
]
}
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๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ํฌํ๋ก๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ํ์ฌ ์ต์ ์
tsc -d -w
๋ช
๋ น์ ์์ํ๊ฑฐ๋ tsconfig๊ฐ ์๋ ๋ชจ๋ ํ์ ๋๋ ํ ๋ฆฌ์ ๋ํด ์ด๋ฅผ ์ํํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค.์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ๋ฐ์ ์ฑ๊ณผ ์๊ฒฉํ๊ฒ ๋ถ๋ฆฌํ ๋งํผ ํฌ์ง๋ ์์ง๋ง ๋ชจ๋ ๊ฒ์ ํจ๊ป ๋์ง ์ ์์ ๋งํผ ์์ง๋ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ 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
๊ฐ๋ฆฌํต๋๋ค.
์ฐ๋ฆฌ๋ ๋ฌถ์/๋ณด๊ธฐ๋ฅผ ์ํด ๊ฟ๊บฝ ๊ฟ๊บฝ ๊ฟ๊บฝ ๊ฟ๊บฝ ์ฌ์ฉํฉ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๋ํ์ง๋ง ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
.d.ts
ํ์ผ๋ก ์ด๋ํฉ๋๋ค. ์ด์์ ์ผ๋ก๋ ๋ค๋ฅธ ํ๋ก์ ํธ์ ์์ค๋ก ์ด๋ํฉ๋๋ค.lerna run build --sort
(๊ฐ ๋๋ ํ ๋ฆฌ์์ ํจ๊ณผ์ ์ผ๋ก tsc
)์
๋๋ค. ์ด๋ ๊ฐ ํจํค์ง์ ๋ํด ํ๋์ TypeScript ์ปดํ์ผ๋ฌ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ์ฌ ๋ง์ ๋ฐ๋ณต ์์
์ ์ํํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. .์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ค๋ช
ํ ๊ฒ๊ณผ ๊ฐ์ ์ํฉ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ๋ฉด๋ฐํ ์ฃผ์ํ๊ณ ์์ต๋๋ค.
๊ฐ๊ฐ์ tsconfig.json ํ์ผ์ด ์๋ ์ฌ๋ฌ "ํ๋ก์ ํธ".
@mhegazy๊ฐ ์ง์ ํ ๊ฒ์ฒ๋ผ ๋น๋ ํ๋ก์ธ์ค๊ฐ ์๋ํฉ๋๋ค. ๊ฐ ํ๋ก์ ํธ๋ .d.ts
ํ์ผ์ ๋ด๋ณด๋ด๊ณ ์ด ํ์ผ ์
์ง์ง ๋ฌธ์ ๋ IDE ์ง์์
๋๋ค. ์ฐธ์กฐ๋ฅผ ์ฐพ์ ๋ ๋จ์ผ tsconfig.json
๋ฒ์ ๋ด์์๋ง ์ฐธ์กฐ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ ๋์ ๊ฒ์ tsconfig.json
๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ข
์ ํ์ผ์ด ๋ค์ ์ปดํ์ผ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ๋ ํ์ผ์ ๊ณ๋จ์ ํจ๊ณผ๊ฐ ํ๋ก์ ํธ ๊ฐ์ ์ ํ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ์ ์ง ๊ด๋ฆฌ์ ๋งค์ฐ ์ข์ง ์์ผ๋ฉฐ ๋๋๋ก IDE์์ ์ก์ ์ ์๋ ๋น๋ ์ค๋ฅ๋ฅผ ์ ๋ฐํฉ๋๋ค.
๋ง์์ฌ
๋ด๊ฐ ๊ฐ๊ณ ์ถ์ ์ ๋ฐ์ดํธ๋ ์๋๋ฆฌ์ค์๋ React ๊ตฌ์ฑ ์์๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฐ๋ฆฌ ํ์ฌ์ ๋ชจ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ์ ํ UI ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ JSX ๋ชจ๋(์์, ๋ถ์ ๋ฐ ์ ๊ธฐ์ฒด)์ด ํฌํจ๋ ๊ตฌ์ฑ ์์ ์ ์ฅ์๊ฐ ์์ต๋๋ค. ์ด ๊ตฌ์ฑ ์์ ์ ์ฅ์๋ ๊ฐ๋ณ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์์ ํ ๋ ๋ชจ๋ ํ๋ฐํธ ์๋ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํฉ๋๋ค. ํน์ ์์ฉ ํ๋ก๊ทธ๋จ์ UI๋ฅผ ํธ์งํ๊ณ ๊ณตํต UI ๊ตฌ์ฑ ์์ ์ ์ฅ์๋ก "์ ์๋ก ์ด๋"ํ ์ ์๋ TypeScript ์ธ์ด ์๋น์ค ๊ฒฝํ์ด ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค. ์ค๋๋ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ฒ๋ค๋ก ๋ฌถ์ด ๋ณต์ฌํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ์์ ๋์์ผ๋ฉด ํ๋ "์์ ์ ํ๋ก์ ํธ ๋ฐฐ๊ด ๋ง๋ค๊ธฐ" ๋ฌธ์ ์ ๋๋ค(.NET ์ธ๊ณ์๋ ์๋ฃจ์ ์๋์ ์๋ ํ๋ก์ ํธ๊ฐ ์๋ ์์ฃผ ์ข์ ์ด์ผ๊ธฐ๊ฐ ์์ต๋๋ค).
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 ์์ฒด)์ ๋ชจ๋๋ฆฌ์ ์ถ๋ ฅ์ ๊ตฌ์ถํ๊ธฐ ๋๋ฌธ์ ์ด์ ํ์ผ์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค. .
์ค์ ํ๋ก์ ํธ์์ ์ํธ ์์ฉ์์ ์ป์ ๋ช ๊ฐ์ง ์ค์ํ ๊ด์ฐฐ:
skipLibCheck
์๋์ ํ์ผ์ ์ ํ ๊ฒ์ฌ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ ์ธก๋ฉด์์ ๊ฑฐ์ "๋ฌด๋ฃ"์
๋๋ค.์ด๊ฒ๋ค์ ์ข ํฉํ๋ฉด, ๊ตฌํ ์ฝ๋์ 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
์ ๊ฐ์ ๋ ๋๋ํ ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.๋น๋ ์ฑ๋ฅ์ ์๋ฏธ ์๊ฒ ๊ฐ์ ํ๋ ค๋ฉด ํ๋ก์ ํธ ์ฐธ์กฐ๋ฅผ ๋ณผ ๋ TypeScript์ ๋์์ ์ ํํด์ผ ํฉ๋๋ค.
ํนํ ๋ค์ ์ฌํญ์ด ์ถฉ์กฑ๋์ด์ผ ํฉ๋๋ค.
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 ๋น๋ ์ค์ผ์คํธ๋ ์ด์ ๋๊ตฌ์ ๋ํ ์ฐธ์กฐ ๊ตฌํ ์ ์ ๊ณตํฉ๋๋ค.
์ด ๋๊ตฌ๋ ๊ณต๊ฐ API๋ง ์ฌ์ฉํด์ผ ํ๋ฉฐ ๋น๋ ๋๊ตฌ ์์ฑ์๊ฐ ํ๋ก์ ํธ ์ฐธ์กฐ๋ฅผ ๊ตฌํํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋๋ก ์ ๋ฌธ์ํ๋์ด์ผ ํฉ๋๋ค.
์ด ์ ์์ ์์ ํ ์๋ฃํ๊ธฐ ์ํด ์ฑ์์ผ ํ ์น์
tsconfig.json
ํ์ผ์ ๋๋กญํ ๋ค์ ๋น๋ ์ค๋ฅ๋ฅผ ์์ ํ๋ ๋ฐ ํ์ํ ์ฐธ์กฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.baseUrl
์ ๋ฏธ์น๋ ์ํฅ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์ ๊ฒฝ์ฐ ๋ ๊ฐ๋จํ ์๋ฃจ์ ์ ์ํ์ต๋๋ค.
๋ด ์ ์ฒด ๊ด์ฌ์ฌ๋ ๊ฐ๋ณ ํ๋ก์ ํธ ๊ตฌ์ฑ ํ์ผ์ ๋ํ ์๋ ๋ด๋ฆผ์ฐจ์ "../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 ์์ ๊ณต๊ฐ ์ฌ์ฉ์๋ ์ฌ๊ธฐ์ ์ ์๋ ์์ ๊ณต๊ฐ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ต๋๋ค.
skipLibCheck
๋ ์ฑ๋ฅ ์ํฅ์ ๋ฌด์ํ ์ ์๋๋ก ํด์ผ ํ์ง๋ง ํ์ธํ์ง ์์์ต๋๋ค.์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์์ง ์์ ๊ฒ๊ณผ ๋ด๊ฐ ์์ฑํ ํ๋ฌ๊ทธ์ธ์ด ์ ๊ณตํ๋ ๊ฒ์ ๋ชจ๋ ์์ค๋ฅผ ๋์์ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ ๊ฐ ์ด์์ ๋ชจ๋์ ๋์์ ๋ณ๊ฒฝํด์ผ ํ ๋ "์ ์๋ก ์ด๋" ๋ฐ "์ ํ ์ ์๋ก ์ด๋"์ ํตํด .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
ํ๊ทธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ต์ ์์
์ปค๋ฐ์ ๊ฐ๋ฆฌํค๋ ์ํ๋ก ์ ์งํ๊ฒ ์ต๋๋ค. ๋ด ํ ์ผ์ ๋ํ ๋ค์ ๋จ๊ณ:
@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 ์์ ํ์ ๋ฉ๋ชจ
์ฌ์ด๋๋ฐ: ์ด ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ ์ค๋ ์๋ํ์ง ์์ต๋๋ค.
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
์ด๋ฆ์ ๋ฐ๊ฟ์ผ ํ๋ค๋ ๊ฒ์ ์๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์
๋๋ค.
๊ตฌํ ๊ณํ์ ๋๋ต์ ์ธ ์ค์ผ์น:
@RyanCavanaugh ๋ ์ ์๋ก ์ด๋ํ์ฌ ๋ชจ๋ ์ฐธ์กฐ๊ฐ ์ด ๋ชจ๋ธ์์ ์๋ํ๋์ง ์ฐพ์ ์ ์์ต๋๊น?
์๋ง์ ๋ฏธํด๊ฒฐ ์ง๋ฌธ์ ๋ํด Anders ๋ฐ Mohamed์์ ์ด์ ํ ๋ก ์์ ๋์จ ๋ฉ๋ชจ
prepend
๋ .d.ts
์๋ ์ ์ฉ๋ฉ๋๊น? ์@internal
๋ก ๋ฌด์์ ํ๋์? ๋ก์ปฌ .d.ts ํ์ผ์ ๋ด๋ถ ์ ์ธ์ ์ ์งํด์ผ ํ์ง๋ง ์ถ๋ ฅ ๋ฒ์ ์๋ ํ์๋์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.--stripInternal
์ ๊ฑฐremove-internal
๋๊ตฌ ์์ฑ(์๋ฃ)@internal
์ ์ธ์ ์ ๊ฑฐํฉ๋๋ค.@types
์์ .d.ts ํ์ผ์ ๋ณ๊ฒฝํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?noEmitOnError
ํ์์ธ๊ฐ์? ์.referenceTarget
-> composable
โจ ๐ฒ ๐ก โจtsbuild
๋๋ ์ด์ ์์ํ๋ ํญ๋ชฉ์ composable
์ ์
์คํธ๋ฆผ๊ณผ ๊ด๋ จ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์ค์ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.{ path: "../blah", circular: true }
์ง์ ํ ์ ์์ต๋๋ค.์ก๋ก
๋๋ ์ด๋ฏธ ์ก๋ค. ๋๋ ๋๋ถ๋ถ ์ปดํ์ผ๋ฌ์์ ์์ค๋งต์ ํด์์ ์ ์งํ๊ณ ์ถ์์ง๋ง(๋ณ๋ ๋๊ตฌ์ ๋ํ ๋ณ๋์ ์ฑ ์) ๋น์ ์ด ์๋ ๋์ ์ด์จ๋ ์ถ๊ฐ ์์ ์ ํ์ต๋๋ค(๋ถ๋ช ํ ์ํํ 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/*"
}
ํํ:
์๋๋ฉด ์ต์ํ ๋ฏธ๋ ์ฌ์ฉ์ ์ํด ๋น๊ฒฝ๋ก ์ด๋ฆ('./' ๋๋ '../'๋ก ์์ํ์ง ์๋ ์ด๋ฆ)์ ์์ฝํ ์ ์์ต๋๊น?
์ด๊ฒ์ด ์ผ๋ง๋ ๊ด๋ จ์ด ์๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง 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 ํ๋ก์ ํธ๋ฅผ ์ํ ์ค๋งํธ ์ฆ๋ถ ๋น๋์
๋๋ค.
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 ํ๋ก์ ํธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค์์ ์ถ๊ฐํ์ฌ ๋น๋ ๋ชจ๋๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค.
<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
์ฌ์ฉํ ์ปดํ์ผ ๋ ์ด์์์ ์๋ ๊ฒฝ๋ก๊ฐ ๊ทธ๋ค์ง ์ค์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ์ ์ฐํฉ๋๋ค.
๋ช
์ฌํด์ผ ํ ํ ๊ฐ์ง๋ ์ผ๋ฐ์ ์ผ๋ก "๋ง์ง๋ง" ํ๋ก์ ํธ๊น์ง prepend
์ฌ์ฉํ์ง ์์ผ๋ ค๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋น๋ ์๊ฐ์ด ํฅ์๋๊ณ ์ฃผ์ด์ง ๋น๋์ ํ์ํ I/O ์์ด ์ค์ด๋ญ๋๋ค.
TypeScript ๋ฆฌํฌ์งํ ๋ฆฌ ์์ฒด๋ ์ฌ๊ธฐ์์ ์ข์ ์ฐธ์กฐ์
๋๋ค. ์ผ๋ถ "๋ผ์ด๋ธ๋ฌ๋ฆฌ" ํ๋ก์ ํธ์ ์ผ๋ถ "์ข
์ " ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค. "์๋ํฌ์ธํธ" ํ๋ก์ ํธ๋ ๊ฐ๋ฅํ ํ ์๊ฒ ์ ์ง๋๊ณ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ๊ฐ์ ธ์ต๋๋ค.
TODO: ๋ ๋ง์ด ์คํํ๊ณ ์ด๊ฒ์ ์์๋ด์ญ์์ค. Rush์ Lerna๋ ์ฐ๋ฆฌ ์ชฝ์์ ๋ค๋ฅธ ๊ฒ์ ์์ํ๋ ๋ค๋ฅธ ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ #25164์ ๋ํ ํผ๋๋ฐฑ์ ์ฐพ๊ณ ์์ต๋๋ค.
@RyanCavanaugh ์์ฃผ ๋ฉ์ง ๊ธ๊ณผ ๋ฐ์ด๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ํนํ. ๊ตฌ์ฑ ํ์ผ ์ฐธ์กฐ๊ฐ ์๋ ํ์ ํ๋ก์ ํธ๋ก ํฐ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ๋ฉฐ์น ์ ๋ณด๋ธ ํ.
๋ช ๊ฐ์ง ๋ฉ๋ชจ๊ฐ ์์ต๋๋ค.
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
๋ชจ๋์ ๋ํ ํผ๋๋ฐฑ๋ชจ๋ ๋น๋์ ๋ชจ๋ ํจํค์ง์ ๋ํด ์ด ๋ฉ์์ง๋ฅผ ๋ฐ์์ผ๋ฏ๋ก ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๋น๋๊ฐ ์์ ํ ๋ค์ ๋น๋๋์์ต๋๋ค. @RyanCavanaugh ๊ฐ ์ด๋ฏธ #25281์์ ์ด ๋ฌธ์ ๋ฅผ ์์ ํ์ผ๋ฏ๋ก 20180628
๋๋ ๋์ค์ ์ผ๊ฐ์ ์
๋ฐ์ดํธํ๋ฉด ๋ ์ด์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๋ค์ ๋ฌธ์ ๋ ์ผ๊ฐ์ ์ต์ 20180628
์
๋ฐ์ดํธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
ํธ์ง: #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
๋ก ๋น๋ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
.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 ํ์ ๋ช
ํํ ์ง์นจ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ์ ์ธ๋ฌธ์ ์์ฑํ๋ ๋ฐฉ๋ฒ.
.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
์ ํ). ์ด๊ฒ์ ๊ตฌ์กฐ์ ์ ํ์ผ๋ก ์ธํด ๋๋๋ก ์๋ํ์ง๋ง ๋ด๋ณด๋ธ ๊ณ ์ ๊ธฐํธ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์คํจํฉ๋๋ค.
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
์ ๊ทผ ๋ฐฉ์์ ๋นํด ๋ฆฌ๊ทธ๋ง๋กค์ด ๋์ ๋๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ํฌํจ์ํต๋๋ค.
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 ์ปดํ์ผ๋ฌ๊ฐ ๋ชจ๋
ธ๋ ํฌ์์ ํ๋ก์ ํธ ๋น๋๋ฅผ ์กฐ์ ํ๋ ์ญํ ์ ์ธ์ํ๋ ค๊ณ ํฉ๋๊น? ์ผ๋ฐ์ ์ผ๋ก ๋๊ตฌ ์ฒด์ธ์๋ ๋ค์๊ณผ ๊ฐ์ ์์
์ ์ ์ฒด ํ์ดํ๋ผ์ธ์ด ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก Gulp ๋๋ Webpack๊ณผ ๊ฐ์ ์์คํ
์ ์ด ํ์ดํ๋ผ์ธ์ ๊ด๋ฆฌํ๊ณ ์ปดํ์ผ๋ฌ๋ ์ฒด์ธ์ ์ค๊ฐ์ ์๋ ํ ๋จ๊ณ์ ๋ถ๊ณผํฉ๋๋ค. ๋๋ก๋ ๋ณด์กฐ ๋๊ตฌ๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋น๋๋ฅผ ์คํํ๊ธฐ๋ ํฉ๋๋ค(์: jest --watch
์ฉ Jest+ts-jest ).
tsc
์ด๋ฌํ ๊ฒ๋ค์ ์ค์ค๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ์กด ๋น๋ ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ์ข
์์ฑ ๊ทธ๋ํ ์์ฒด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์๋ฅผ ๋ค์ด ๊ฐ ํ๋ก์ ํธ ํด๋์์ tsc๋ฅผ ์ฌ๋ฐ๋ฅธ ์์๋ก ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น(์ ์ฒ๋ฆฌ๊ฐ ์
๋ฐ์ดํธ๋ ํ)?
๋๋ ๋์์ธ์ด ๋จ์ผ ํจ์ค๋ก ์ ์ฒด monorepo๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ผ๋ฉด(์ค๋ ์ฐ๋ฆฌ๋ ๋ณ๋์ NodeJ ํ๋ก์ธ์ค์์ ๊ฐ ํ๋ก์ ํธ๋ฅผ ๋น๋ํจ) ๋ค๋ฅธ ๋น๋ ์์ ์ด ์ด๋ป๊ฒ ์ฐธ์ฌํ ์ง ๊ถ๊ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์์ webpack์ ์คํํ ๊ฒ์ธ๊ฐ? ๋ชจ๋ ํ๋ก์ ํธ๋ฅผ ํ ๋ฒ์? (๊ณผ๊ฑฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.) ๋ค์ค ํ๋ก์ธ์ค ๋์์ฑ์ ํ์ฉํ๋ ๊ธฐ๋ฅ์ ์๊ฒ ๋ ๊น์?
์ด๊ฒ์ BTW์ ๋ํ ๋นํ์ด ์๋๋๋ค. ๋๋ ๋จ์ง ํฐ ๊ทธ๋ฆผ๊ณผ ์๋๋ ์ฌ์ฉ๋ฒ์ ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
@pgonzal ๋ง์ต๋๋ค. ์ค์ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ์๋ tsc๊ฐ ์๋ ๋ถ๋ถ์ด ๋ง์ด ์์ต๋๋ค. lerna monorepo์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ์ต๋๋ค.
prebuild
์คํฌ๋ฆฝํธ ๋ฐ / ๋๋ postbuild
๊ทธ๊ฒ์์ ์คํฌ๋ฆฝํธ package.json
. ์ฌ๊ธฐ์๋ ๋น๋์ ๋น tsc ์ธก๋ฉด์ด ํฌํจ๋ฉ๋๋ค.package.json
์๋ ๋ค์ ์คํฌ๋ฆฝํธ๊ฐ ์์ต๋๋ค.
"prebuild": "lerna run prebuild",
"build": "tsc --build monorepo.tsconfig.json --verbose",
"postbuild": "lerna run postbuild",
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
์ข์ ๊ธ์ ๋๋ค. ์ ๊ณตํด์ฃผ์ ์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทํ์ ๋ฌธ์ ๋ฅผ ์์๋๋ก -
--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
์ผ๊ธฐ). ์ด๋ฅผ ๋ฐํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ๋ณ ์์
์ด ์์ผ๋ฏ๋ก ์์๋๋ก ์๋ํ์ง ์๋ ๊ฒ์ด ๋ณด์ด๋ฉด ์ผ๋ถ ์ฌ๋ก๋ฅผ ๋์ณค์ ์ ์์ผ๋ฏ๋ก ๋ฒ๊ทธ๋ฅผ ๊ธฐ๋กํ์ญ์์ค.
ํ์ฌ ์ถ์ ์ค์ธ ๋ฏธํด๊ฒฐ ๋ฌธ์ :
learn-a
REPO ๊ทธ ์ฉ๋ yarn
, ๋ค๋ฅธ ๊ทธ ์ฉ๋ pnpm
, ๋ค๋ฅธ ์ฉ๋ ๊ฒ์ ๋ชจ๋์์ ๊ทธ ์ค ํ๋๋ฅผ ๊ทธ์ด๋ฆฐ ์ง๋ฌธ
package.json
๋ฅผ ์ฝ๋ ๋ก์ง์ ๊ตฌํํด์ผ ํฉ๋๊น? ๊ธฐ๋ก #25376composite
ํ๋ก์ ํธ์ ๋ํด .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();
@ryancavanaugh
๋ชจ๋์ด ๋ฌด์์
๋๊น? TS๊ฐ ๋ชจ๋์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๊น?outFile
ํ์ํฉ๋๊น?๋๋ 2๊ฐ์ ๊ฐ๋จํ ํ๋ก์ ํธ essentials
๋ฐ common
๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ณตํต์ ์ ํ์ ํญ๋ชฉ์ผ๋ก ์ปดํ์ผ๋ ํญ๋ชฉ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
@aleksey-bykov
์ํ ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ฅผ ์ง๋จํ ์ ์์ต๋๋ค.
@RyanCavanaugh ์ ๋ฐ ํด์ฃผ์ธ์
์.zip
@RyanCavanaugh , tsc --build --watch
์์ค ํ์ผ์ ์์ ์ฌํญ์ ๋ณผ ๋๊น์ง ์ฒ์์๋ ํ์ผ์ ์ถ๋ ฅํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
์ค๋ ๋๊ฐ ๋๋ฌด ๊น๋๋ค(์๊ฐ๊ณผ ๊ณต๊ฐ ๋ชจ๋์์). Lucky Issue number 100 * 2^8 : #25600์์ ํ ๋ก ์ ์์ํฉ์๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋์์ ๋ฌธ์/๋ธ๋ก๊ทธ ํฌ์คํธ ์์ ์งํ ์ค(ํผ๋๋ฐฑ์ ๋ฐ๋ผ ์์ ์์ )
์ด ์ค๋ ๋๋ฅผ ํ๋ก์ฐํ๋ ์ฌ๋์ ๋๊ตฌ๋ ์๋ํด ๋ณผ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ ๋ ํ์ฌ ๋ชจ๋ ธ๋ ํฌ ์๋๋ฆฌ์ค๋ฅผ ์์ฑํ์ฌ ๋ง์ง๋ง ๋ฒ๊ทธ/๊ธฐ๋ฅ์ ์์ ํ๊ณ ์์ผ๋ฉฐ ๊ณง ์ด์ ๋ํ ์ง์นจ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
ํ๋ก์ ํธ ์ฐธ์กฐ
ํ๋ก์ ํธ ์ฐธ์กฐ๋ TypeScript ํ๋ก๊ทธ๋จ์ ๋ ์์ ์กฐ๊ฐ์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ TypeScript 3.0์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋น๋ ์๊ฐ์ ํฌ๊ฒ ๊ฐ์ ํ๊ณ ๊ตฌ์ฑ ์์ ๊ฐ์ ๋ ผ๋ฆฌ์ ๋ถ๋ฆฌ๋ฅผ ์ ์ฉํ๋ฉฐ ์๋กญ๊ณ ๋ ๋์ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๋ํ ๋ ๋น ๋ฅธ TypeScript ๋น๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ํ๋ก์ ํธ ์ฐธ์กฐ์ ํจ๊ป ์๋ํ๋
tsc
,--build
ํ๋๊ทธ์ ๋ํ ์๋ก์ด ๋ชจ๋๋ฅผ ๋์ ํฉ๋๋ค.์์ ํ๋ก์ ํธ
์๋นํ ์ ์์ ์ธ ํ๋ก๊ทธ๋จ์ ์ดํด๋ณด๊ณ ํ๋ก์ ํธ ์ฐธ์กฐ๊ฐ ํ๋ก๊ทธ๋จ์ ๋ ์ ๊ตฌ์ฑํ๋ ๋ฐ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ๋ด ์๋ค.
converter
๋ฐunits
๋ ๊ฐ์ ๋ชจ๋์ด ์๋ ํ๋ก์ ํธ์ ๊ฐ๊ฐ์ ํด๋นํ๋ ํ ์คํธ ํ์ผ์ด ์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค.ํ ์คํธ ํ์ผ์ ๊ตฌํ ํ์ผ์ ๊ฐ์ ธ์ค๊ณ ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค.
์ด์ ์๋ ๋จ์ผ tsconfig ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ค์ ์ด์ํ์ต๋๋ค.
src
๊ฐ ์ถ๋ ฅ ํด๋ ์ด๋ฆ์ ํ์๋์ง ์๊ณtest
๋ฐsrc
๋ฅผ ๋์์ ๋น๋ํ ์ ์์์ต๋๋ค.์ฌ๋ฌ tsconfig ํ์ผ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ฌธ์ ์ค ์ผ๋ถ ๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง ์๋ก์ด ๋ฌธ์ ๊ฐ ๋ํ๋ฉ๋๋ค.
tsc
๋ ๋ฒ ์คํํ๊ฒ ๋ฉ๋๋ค.tsc
๋ ๋ฒ ํธ์ถํ๋ฉด ๋ ๋ง์ ์์ ์๊ฐ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.tsc -w
๋ ํ ๋ฒ์ ์ฌ๋ฌ ๊ตฌ์ฑ ํ์ผ์์ ์คํํ ์ ์์ต๋๋ค.ํ๋ก์ ํธ ์ฐธ์กฐ๋ ์ด๋ฌํ ๋ชจ๋ ๋ฌธ์ ๋ฑ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ์ฐธ์กฐ๋ ๋ฌด์์ ๋๊น?
tsconfig.json
ํ์ผ์๋ ์๋ก์ด ์ต์์ ์์ฑreferences
์์ต๋๋ค. ์ฐธ์กฐํ ํ๋ก์ ํธ๋ฅผ ์ง์ ํ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ๋๋ค.๊ฐ ์ฐธ์กฐ์
path
์์ฑ์tsconfig.json
ํ์ผ์ด ํฌํจ๋ ๋๋ ํ ๋ฆฌ ๋๋ ๊ตฌ์ฑ ํ์ผ ์์ฒด(์ด๋ฆ์ด ์์ ์ ์์)๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค.ํ๋ก์ ํธ๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ก์ด ์ผ์ด ๋ฐ์ํฉ๋๋ค.
.d.ts
)์ด ๋ก๋๋ฉ๋๋ค.outFile
๋ฅผ ์์ฑํ๋ฉด ์ถ๋ ฅ ํ์ผ.d.ts
ํ์ผ์ ์ ์ธ์ด ์ด ํ๋ก์ ํธ์์ ํ์๋ฉ๋๋ค.์ฌ๋ฌ ํ๋ก์ ํธ๋ก ๋ถ๋ฆฌํ๋ฉด ์ ํ ๊ฒ์ฌ ๋ฐ ์ปดํ์ผ ์๋๋ฅผ ํฌ๊ฒ ํฅ์์ํค๊ณ ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ฉฐ ํ๋ก๊ทธ๋จ์ ๋ ผ๋ฆฌ์ ๊ทธ๋ฃนํ ์ํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
composite
์ฐธ์กฐ๋ ํ๋ก์ ํธ์๋ ์
composite
์ค์ ์ด ํ์ฑํ๋์ด ์์ด์ผ ํฉ๋๋ค.์ด ์ค์ ์ TypeScript๊ฐ ์ฐธ์กฐ๋ ํ๋ก์ ํธ์ ์ถ๋ ฅ์ ์ฐพ์ ์์น๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒฐ์ ํ ์ ์๋๋ก ํ๋ ๋ฐ ํ์ํฉ๋๋ค.
composite
ํ๋๊ทธ๋ฅผ ํ์ฑํํ๋ฉด ๋ช ๊ฐ์ง ์ฌํญ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.rootDir
์ค์ ์ ๋ช ์์ ์ผ๋ก ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋กtsconfig
ํ์ผ์ด ํฌํจ๋ ๋๋ ํ ๋ฆฌ๋ก ์ค์ ๋ฉ๋๋ค.include
ํจํด๊ณผ ์ผ์นํ๊ฑฐ๋files
๋ฐฐ์ด์ ๋์ด๋์ด์ผ ํฉ๋๋ค. ์ด ์ ์ฝ ์กฐ๊ฑด์ ์๋ฐํ๋ฉดtsc
์ง์ ๋์ง ์์ ํ์ผ์ ์๋ ค์ค๋๋ค.declaration
๊ฐ ์ผ์ ธ ์์ด์ผ ํฉ๋๋ค.declarationMaps
์ ์ธ ์์ค ๋งต์ ๋ํ ์ง์๋ ์ถ๊ฐํ์ต๋๋ค.
--declarationMap
๋ฅผ ํ์ฑํํ๋ฉด "์ ์๋ก ์ด๋" ๋ฐ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ์ ๊ฐ์ ํธ์ง๊ธฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ง์๋๋ ํธ์ง๊ธฐ์์ ํ๋ก์ ํธ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ฝ๋๋ฅผ ํฌ๋ช ํ๊ฒ ํ์ํ๊ณ ํธ์งํ ์ ์์ต๋๋ค.prepend
outFile
์ฐธ์กฐ์์
prepend
์ต์ ์ ์ฌ์ฉํ์ฌ ์ข ์์ฑ์ ์ถ๋ ฅ์ ์์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.ํ๋ก์ ํธ๋ฅผ ์ถ๊ฐํ๋ฉด ํ์ฌ ํ๋ก์ ํธ์ ์ถ๋ ฅ ์์ ํ๋ก์ ํธ์ ์ถ๋ ฅ์ด ํฌํจ๋ฉ๋๋ค.
์ด๊ฒ์
.js
ํ์ผ๊ณผ.d.ts
ํ์ผ ๋ชจ๋์์ ์๋ํ๋ฉฐ ์์ค ๋งต ํ์ผ๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋ด๋ณด๋ด์ง๋๋ค.tsc
๋ ์ด ํ๋ก์ธ์ค๋ฅผ ์ํํ๊ธฐ ์ํด ๋์คํฌ์ ๊ธฐ์กด ํ์ผ๋ง ์ฌ์ฉํ๋ฏ๋ก ์ผ๋ถ ํ๋ก์ ํธ์ ์ถ๋ ฅ์ด ๊ฒฐ๊ณผ ํ์ผ์ ๋ ๋ฒ ์ด์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅธ ์ถ๋ ฅ ํ์ผ์ ์์ฑํ ์ ์๋ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. .์๋ฅผ ๋ค์ด:
์ด ์ํฉ์์๋
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
๋ ์ข ์์ฑ์ด ํญ์ ๋จผ์ ๋น๋๋๋๋ก ํ์ํ ๊ฒฝ์ฐ ํ์ผ์ ์ฌ์ ๋ ฌํฉ๋๋ค.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 ํ๋ก์ ํธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค์์ ์ถ๊ฐํ์ฌ ๋น๋ ๋ชจ๋๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค.
๋น์ ์ ํ๋ก์ ํธ ํ์ผ์. ์ด๋ ๊ฒ ํ๋ฉด ์๋ ์ฆ๋ถ ๋น๋ ๋ฐ ์ ๋ฆฌ๊ฐ ํ์ฑํ๋ฉ๋๋ค.
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๋ ์ฐ๋ฆฌ ์ชฝ์์ ๋ค๋ฅธ ๊ฒ์ ์์ํ๋ ๋ค๋ฅธ ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.