tsconfig - TypeScript-kompilatoralternativer - prøver å få «flat» utgang til outDir


Jeg har en src-mappe med kildekoden og enhetstestene mine, og en test-mappe som inneholder en separat hastighetstest.

Når jeg bygger prosjektet mitt med tsc, får jeg en mappestruktur som dette:

dist/
  src/
    index.js
    ...
  test/
    speed-test.js

Jeg foretrekker imidlertid å få «flat» output til min dist-mappe, slik:

dist/
  index.js
  ...
  speed-test.js
  ...

Hvis jeg sletter speed-test.ts fra test-katalogen, legger ikke tsc til en src-katalog i dist. Den ekstra katalogstrukturen legges bare til når det er behov (eller i det minste når tsc bestemmer at det er behov) for å skille kildene til den kompilerte koden.

Jeg er sikker på at det er veldig nyttig noen ganger for å unngå filnavnkonflikter, men det er ikke viktig for meg i dette tilfellet, og jeg vil helst ikke få denne ekstra «hjelpen».

Her er min tsconfig.json:

{
  "compilerOptions": {
    "target": "ES6",
    "module": "commonjs",
    "outDir": "./dist",
    "noImplicitAny": true,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "noImplicitReturns": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "resolveJsonModule": true,
    "allowSyntheticDefaultImports": true
  }
}

Jeg prøvde å legge til et "rootDirs"-alternativ på ["src", "test"], men det hjalp ikke.

Finnes det en måte for meg å få den utdata-strukturen jeg ser etter?

Svar #1

Hvorfor nestede utdata-mapper inne i outDir?

Hvis jeg sletter speed-test.ts fra test-katalogen, legger ikke tsc til en src-katalog i dist.

TypeScript bestemmer én hovedmappe som inneholder alle kildefilene dine. Denne mappen settes som rootDir i tsconfig.json eller beregnes automatisk av kompilatoren.

For eksempel, hvis du inkluderer ./test/speed-test.ts i kompileringen (./=prosjektrot), som importerer andre kildefiler fra ./src, vil den overordnede mappen være ./ og den kompilerte versjonen vil ha banen <outDir>/test/speed-test.js.

Hvordan gjøre utdata-mappen flat?

Vi trenger to ting: 1.) TS prosjektreferanser 2.) rootDirs.

Prosjektreferanser vil opprette uavhengige underprosjekter, hvert med sin egen rootDir-konfigurasjon. Dette har flere fordeler, som økt kompileringstidsprestasjon. Og vi kan strukturere utdata-mappen (outDir) mer fleksibelt.

rootDirs vil fortelle kompilatoren at src og test blir slått sammen til en enkelt mappe i løpet av kompileringen. Nå kan vi skrive importstier som blir validert av kompilatoren som om begge utgjør en enkelt mappe. Tenk deg at ./test/speed-test.ts trenger ./src/main.ts - da kan du skrive følgende import med eksisterende mappestruktur:

// ./test/inside speed-test.ts
import {something} from "./main" // main.ts is still inside "./src"

Merk: TypeScript omskriver ikke importbaner, rootDirs påvirker kun validering av inndata-typer.

kortversjon: Kode

.
├── package.json
├── src
│   ├── main.test.ts
│   ├── main.ts
│   └── tsconfig.json
├── test
│   ├── speedtest.ts
│   └── tsconfig.json
├── tsconfig-base.json
└── tsconfig.json

./src/main.ts:

export const foo = "foo"

./src/tsconfig.json:

{
  "extends": "../tsconfig-base.json",
  "compilerOptions": {
    "outDir": "../dist",
    "composite": true, // needed for references sub-projects
    "rootDir": ".",
    "tsBuildInfoFile": "../dist/srcbuildinfo"
  }
}

./test/speedtest.ts:

import { foo } from "./main"; // important(!): pretend, `src/main` is same folder
console.log(foo);
// ... do performance tests ...

./test/tsconfig.json:

{
  "extends": "../tsconfig-base.json",
  "compilerOptions": {
    "outDir": "../dist",
    "rootDir": ".",
    "composite": true, 
    "tsBuildInfoFile": "../dist/testbuildinfo",
    "rootDirs": ["../src", "../test"] // important (!)
  },
  "references": [
    {
      "path": "../src" // test project depends on src
    }
  ]
}

./tsconfig.json:

{
  "files": [], // this root tsconfig just exists to compose sub-projects
  "references": [
    {
      "path": "./src"
    },
    {
      "path": "./test"
    }
  ]
}

tsconfig-base.json inneholder alle egne konfigurasjonsverdier. Kompilering med tsc -b -v vil plassere alle filer under ./dist, samme importbaner som spesifisert i kilden:

dist
├── main.d.ts
├── main.js
├── main.test.d.ts
├── main.test.js
├── speedtest.d.ts
├── speedtest.js
├── ...

Til slutt, hvis du trenger mer informasjon om prosjektreferanser - her er et annet kodeeksempel.

Relaterte artikler