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.tsfratest-katalogen, legger ikketsctil ensrc-katalog idist.
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.
