typescript - Postavljanje tsconfig-a s mapom spec/test
Recimo da stavim svoj kod u src i testove u spec:
+ spec
+ --- classA.spec.ts
+ src
+ --- classA.ts
+ --- classB.ts
+ --- index.ts
+ tsconfig.json
Želim samo transpajlirati src u mapu dist. Budući da je index.ts ulazna točka mog paketa, moj tsconfig.json izgleda ovako:
{
"compileOptions": {
"module": "commonjs"
"outDir": "dist"
},
"files": {
"src/index.ts",
"typings/main.d.ts"
}
}
Međutim, ovaj tsconfig.json ne uključuje testne datoteke pa nisam mogao riješiti ovisnosti u njima.
S druge strane, ako uključim testne datoteke u tsconfig.json, one se također transpileiraju u mapu dist.
Kako riješiti ovaj problem?
Odgovor #1
Na kraju sam definirao više konfiguracijskih datoteka i koristio extends da ih pojednostavim.
Recimo da imam dvije datoteke: tsconfig.json i tsconfig.build.json
// tsconfig.json
{
...
"exclude": [...]
}
// tsconfig.build.json
{
...
"files": [ "typings/index.d.ts", "src/index.ts" ]
}
Na ovaj način, mogu imati dobru kontrolu nad tim što graditi (koristeći tsc -p tsconfig.build.json) i što ts jezična usluga (IDE) obrađuje.
AŽURIRANJE: sada, kako moji projekti rastu, završio sam s više konfiguracijskih datoteka. Koristim značajku "extend" koja je sada dostupna u TypeScriptu:
// tsconfig.base.json
{
// your common settings. Mostly "compilerOptions".
// Do not include "files" and "include" here,
// let individual config handles that.
// You can use "exclude" here, but with "include",
// It's pretty much not necessary.
}
// tsconfig.json
{
// This is used by `ts language service` and testing.
// Includes source and test files.
"extends": "./tsconfig.base.json",
"atom": { ... },
"compilerOptions": {
// I set outDir to place all test build in one place,
// and avoid accidentally running `tsc` littering test build to my `src` folder.
"outDir": "out/spec"
}
"include": [ ... ]
}
// tsconfig.commonjs.json or tsconfig.systemjs.json or tsconfig.global.json etc
{
"extends": "./tsconfig.base.json",
"compilerOptions": {
// for some build this does not apply
"declaration": true/false,
"outDir": "dist/<cjs, sys, global, etc>",
"sourceRoot": "..."
},
// Only point to typings and the start of your source, e.g. `src/index.ts`
"files": [ ... ],
"include": [ ... ]
}
Odgovor #2
Evo detaljnog rješenja za upravljanje izvorima i testovima:
- kompilacija uključuje mape/datoteke izvora i testova
- izgradnja uključuje samo izvore
- IDE (VSCode, ...)
Konfiguracija
Rješenje se temelji na 2 tsconfig.json datoteke kao što je spomenuto u drugim odgovorima.
Glavni ./tsconfig.json (koristi se za kompilaciju i IDE):
{
"compileOptions": {
"module": "commonjs"
"outDir": "dist"
},
"include": [
"spec/**/*.spec.ts"
],
"files": [
"src/index.ts"
]
}
Drugi ./tsconfig-build.json (koristi se za izgradnju):
{
"extends": "./tsconfig.json",
"exclude": [
"spec/**/*.spec.ts"
]
}
Napomena: isključujemo testne datoteke koje su prethodno uključene
Izgraditi
Build naredba: tsc -p tsconfig-build.json
Ili npm run build ako je skripta dodana u package.json:
{
"scripts": {
"build": "tsc -p tsconfig-build.json",
}
Odgovor #3
Ovo donekle ovisi o okviru za testiranje koji koristite, ali ja volim koristiti ts-node za kompajliranje mojih testnih datoteka. Koristeći mochu, vaš npm test skripta mogla bi izgledati ovako:
"mocha": "mocha test/ --compilers ts:ts-node/register --recursive"
U svom tsconfig.json, pobrinite se ukloniti opciju rootDir.
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"noImplicitAny": false,
"removeComments": true,
"sourceMap": true,
"outDir": "lib"
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules",
"lib",
"typings/**"
]
}
Kada pokušate pokrenuti TypeScript s rootDir postavljenim na src ili bilo koju osnovnu mapu za vaš aplikacijski kod, to će zabraniti bilo kakvu kompilaciju u direktoriju koji se nalazi izvan toga, poput tests. Koristeći ts-node, možete lako sve držati odvojeno bez potrebe za zasebnim TypeScript konfiguracijskim datotekama.
