web-dev-qa-db-fra.com

Configuration de tsconfig avec le dossier spec / test

Disons que je mets mon code sous src et les tests sous spec:

+ spec
+ --- classA.spec.ts
+ src
+ --- classA.ts
+ --- classB.ts
+ --- index.ts
+ tsconfig.json

Je souhaite uniquement transpiler src dans le dossier dist. Puisque index.ts est le point d'entrée de mon colis, mon tsconfig.json ressemble à ca:

{
  "compileOptions": {
    "module": "commonjs"
    "outDir": "dist"
  },
  "files": {
    "src/index.ts",
    "typings/main.d.ts"
  }
}

Cependant, cette tsconfig.json n'inclut pas les fichiers de test, je n'ai donc pas pu y résoudre les dépendances.

D'un autre côté, si j'inclus les fichiers de test dans tsconfig.json puis ils sont également transposés dans le dossier dist.

Comment résoudre ce problème?

38
unional

J'ai fini par définir plusieurs fichiers de configuration et utiliser extends pour les simplifier.

Disons que j'ai deux fichiers: tsconfig.json et tsconfig.build.json

// tsconfig.json
{
  ...
  "exclude": [...]
}

// tsconfig.build.json
{
  ...
  "files": [ "typings/index.d.ts", "src/index.ts" ]
}

De cette façon, je peux avoir un contrôle précis sur ce qu'il faut construire (en utilisant tsc -p tsconfig.build.json) et ce que le ts language service (IDE) gère.

MISE À JOUR: maintenant que mes projets grandissent, j'ai fini par avoir plus de fichiers de configuration. J'utilise la fonctionnalité "étendre" qui est maintenant disponible en TypeScript:

// 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": [ ... ]
 }
30
unional

Cela dépend quelque peu du framework de test que vous utilisez, mais j'aime utiliser ts-node pour compiler mes fichiers de test. En utilisant mocha, votre npm test le script pourrait ressembler à ceci:

"mocha": "mocha test/ --compilers ts:ts-node/register --recursive"

Dans votre tsconfig.json, assurez-vous de supprimer l'option rootDir.

{
"compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "noImplicitAny": false,
    "removeComments": true,
    "sourceMap": true,
    "outDir": "lib"
},
"include": [
    "src/**/*.ts"
],
"exclude": [
    "node_modules",
    "lib",
    "typings/**"
]
}

Lorsque vous essayez d'exécuter TypeScript avec rootDir défini sur src ou quel que soit le dossier de base de votre code d'application, il interdira toute compilation dans un répertoire situé à l'extérieur, tel qu'un tests. En utilisant ts-node, vous pouvez facilement tout garder séparé sans avoir à avoir des fichiers de configuration TypeScript distincts.

6
barndog

Je pense que vous ne devriez pas utiliser l'option 'files' dans votre configuration. Au lieu de cela, vous pouvez exclure les fichiers indésirables et les avoir comme ceci:

{ 
    "compilerOptions": { 
        "module": "commonjs", 
        "outDir": "dist"
    },
    "exclude": [
        "node_modules",
        "dist",
        "typings/browser.d.ts",
        "typings/browser/**"
    ]
} 

Cela préservera votre structure d'origine dans le dossier 'dist' sans mélanger les tests et les fichiers js de l'application:

--dist
----spec
-------....
----src
-------....
4
Amid