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.

Povezani članci