3 votes

TypeScript `tsc` ne prend pas en compte tsconfig.json à l'intérieur d'un sous-répertoire?

J'ai la structure de répertoire suivante:

.
 tsconfig.json ("module": "CommonJS")
 foo/
     node-file.ts
     bar/
         browser-file.ts
         tsconfig.json ("module": "esnext")

Le tsconfig.json racine a module défini sur CommonJS parce que je veux que la plupart de mes fichiers soient compilés pour Node. Mais à l'intérieur de bar, je veux que les fichiers soient compilés en modules JavaScript, donc j'ai configuré module sur esnext.

Maintenant, lorsque je lance tsc depuis la racine, je m'attends à ce que node-file.ts soit compilé en module CommonJS et browser-file.ts soit compilé en un module JavaScript. Mais ce n'est pas ce que j'obtiens. Il semble que tsc ignore complètement foo/bar/tsconfig.json et ne prend en compte que le tsconfig.json racine.

(J'utilise également tsc --watch pendant le développement, donc j'essaie d'éviter d'avoir à exécuter deux processus tsc différents pour compiler les deux cibles. J'ai l'impression qu'en exécutant un seul tsc avec des fichiers tsconfig.json imbriqués devrait me donner les résultats souhaités.)

Quelqu'un sait ce que je fais de travers?

5voto

cherryblossom Points 5523

TypeScript utilise uniquement un tsconfig.json et n'utilise pas automatiquement le tsconfig.json des sous-répertoires pour les fichiers qui s'y trouvent. Cependant, vous pouvez utiliser des références de projet pour cela.

Créez une structure de répertoire comme ceci :

.
 tsconfig.json
 tsconfig.settings.json (optionnel)
 foo/
     node-file.ts
     tsconfig.json ("module" : "commonjs")
     bar/
         browser-file.ts
         tsconfig.json ("module" : "esnext")

tsconfig.json

{
  "files": [],
  "references": [
    {"path": "./foo"},
    {"path": "./foo/bar"}
  ]
}

Ceci est le tsconfig.json racine. Lorsque vous exécutez tsc --build (voir ci-dessous) dans le répertoire racine, TypeScript construira les projets référencés ./foo/tsconfig.json et ./foo/bar/tsconfig.json.

Les "files": [] sont pour arrêter les tsc accidentels sans --build qui tentent de compiler tout dans le répertoire racine, ce qui provoquera une erreur mais créera plusieurs fichiers .js possiblement aux mauvais endroits.

tsconfig.settings.json (optionnel)

{
  "compilerOptions": {
    "strict": true,
    "noImplicitReturns": true
  }
}

Vous pouvez mettre en place une configuration commune à foo et foo/bar et étendre cette configuration avec extends pour réduire la duplication. Notez que tous les chemins relatifs ici seront résolus par rapport à tsconfig.settings.json lorsqu'ils sont étendus, donc quelque chose comme "outDir": "dist" peut ne pas fonctionner comme prévu.

foo/tsconfig.json

{
  "extends": "../tsconfig.settings.json",
  "exclude": ["bar/**/*.ts"],
  "compilerOptions": {
    "module": "commonjs"
  }
}

Ceci est la configuration pour les fichiers CommonJS. Elle étend également la configuration commune et exclut les fichiers dans foo/bar.

foo/bar/tsconfig.json

{
  "extends": "../../tsconfig.settings.json",
  "compilerOptions": {
    "module": "esnext"
  }
}

Ceci est assez similaire à la configuration de foo.


Construction

Pour compiler foo et foo/bar en même temps, utilisez le mode de construction à partir du répertoire racine :

tsc --build # ou tsc -b
# Mode ouverture :
tsc --build --watch # ou tsc -b -w

De le manuel :

Une fonctionnalité tant attendue est la construction intelligente incrémentielle pour les projets TypeScript. Dans la version 3.0, vous pouvez utiliser le drapeau --build avec tsc. Il s'agit en fait d'un nouveau point d'entrée pour tsc qui se comporte plus comme un orchestrateur de construction que comme un simple compilateur.

En exécutant tsc --build (tsc -b pour faire court), les étapes suivantes seront effectuées :

  • Trouver tous les projets référencés
  • Détecter s'ils sont à jour
  • Construire les projets obsolètes dans le bon ordre

Vous pouvez fournir à tsc -b plusieurs chemins de fichiers de configuration (par exemple tsc -b src test). Tout comme tsc -p, spécifier le nom du fichier de configuration est inutile s'il est nommé tsconfig.json.

Vous pouvez également compiler des projets individuels :

tsc -b foo # ou cd foo && tsc
tsc -b foo/bar # ou cd foo/bar && tsc

Notez qu'il y a des drapeaux spécifiques à la construction et vous ne pouvez pas remplacer les options du compilateur avec des arguments en ligne de commande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X