build - Behåll src/-mappstrukturen när du bygger till dist/-mappen med TypeScript 3


Jag har en TypeScript Node.js-server med denna struktur:

tsconfig.json
package.json
src/
    middleware/
    utils/
    index.ts
dist/
    middleware/
    utils/
    index.js

När jag använde TypeScript 2 kunde jag transpila mitt projekt från src/ till en dist/-mapp och ha en spegelbild av min mappstruktur att arbeta med.

Med lanseringen av TypeScript 3 har de introducerat projektreferenser och ändrat sättet som kod transpileras till en utmatningskatalog. Nu skriver tsc ut till dist/-mappen på ett inbäddat sätt som detta:

dist/
    src/
        middleware/
        utils/
        index.js

Min tsconfig.json är:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "allowJs": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "resolveJsonModule": true,
    "declaration": false,
    "outDir": "dist/",
    "lib": [
      "es7",
      "dom"
    ]
  },
  "include": [
    "src/"
  ]
}

Hur kan jag konfigurera TypeScript för att skriva ut min src/-mapp som en spegelbild i en dist/-mapp?

Svar #1

Jag hade ett liknande problem när jag initialt konverterade till ett TypeScript-projekt. Jag satte också resolveJsonModule: true och src-katalogen kopierades till utmatningskatalogen dist.

Den underliggande anledningen är att en av mina källfiler requirede package.json i projektets rot. När jag tog bort det, lade tsc inte längre till src i dist-mappen.

Kort sagt, se till att du inte kräver filer utanför din src-katalog.

Förklarande FAQ här: https://github.com/Microsoft/TypeScript/wiki/FAQ#why-does---outdir-moves-output-after-adding-a-new-file

Svar #2

Strukturen på utmatningskatalogen styrs av rootDir i compilerOptions. Se dokumentationen här, att sätta den till ./src bör lösa problemet.

{
  "compilerOptions": {
    "rootDir": "src",
    ...
  },
  "include": [
    "src/"
  ]
}

Svar #3

Uppgraderingen från TypeScript 2 till 3 borde i sig inte ha förändrat beteendet; om vi kan bekräfta att den gjorde det kan det vara ett fel. Kontrollera i vilket fall att kompilatoralternativet rootDir pekar på din src-katalog och inte på överordnad katalog, eftersom strukturen under rootDir är det som speglas under outDir.

Svar #4

Förutom att specificera compilerOptions.outDir, specificera compilerOptions.rootDir i tsconfig.json.

{
  "compilerOptions": {
     // ...
    "outDir": "dist",
    "rootDir": "./",
    // ...
  }
}

Kör sedan: $ tsc -b i den mapp där tsconfig.json-filen finns.

Observera: compilerOptions.rootDir bör användas när du vill inkludera en struktur av filer från en icke-nästad mapp i mappen för tsconfig.json-filen.

Relaterade artiklar