Come posso fare in modo che il compilatore Typescript restituisca il js compilato in una directory diversa?


119

Sono abbastanza nuovo in TypeScript e in questo momento ho file .ts in diversi punti attraverso la struttura del mio progetto:

app/
 |-scripts/
    |-app.ts
    |
    |-classes/
    |  |-classA.ts
    |  |-classB.ts
    |  
    |-controllers/
    |  |-controllerA.ts
    |  |-controllerB.ts
    |  
    |-otherStuff/
       |-otherstuffA.ts

In questo momento, quando i miei file vengono compilati, vengono compilati nella stessa directory in cui si trovano i file .ts:

app/
 |-scripts/
    |-app.ts
    |-app.js
    |
    |-classes/
    |  |-classA.ts
    |  |-classB.ts
    |  |-classA.js
    |  |-classB.js
    |  
    |-controllers/
    |  |-controllerA.ts
    |  |-controllerB.ts
    |  |-controllerA.js
    |  |-controllerB.js
    |  
    |-otherStuff/
       |-otherstuffA.ts
       |-otherStuffA.js

Anche se mi piace il modo in cui i file .js mantengono la stessa struttura di directory dei file .ts, non voglio tenere traccia dei file .js nel mio VCS, quindi mi piacerebbe mantenere tutti i miei file JavaScript in un albero di directory separato (che posso quindi aggiungere a .gitignore), in questo modo:

app/
 |-scripts/
 |  |-app.ts
 |  |
 |  |-classes/
 |  |  |-classA.ts
 |  |  |-classB.ts
 |  |  
 |  |-controllers/
 |  |  |-controllerA.ts
 |  |  |-controllerB.ts
 |  |  
 |  |-otherStuff/
 |     |-otherstuffA.ts
 |
 |-js/
    |-app.js
    |
    |-classes/
    |  |-classA.js
    |  |-classB.js
    |
    |-controllers/
    |  |-controllerA.js
    |  |-controllerB.js
    |
    |-otherStuff/
       |-otherstuffA.js

C'è un'impostazione o un'opzione da qualche parte che dirà al compilatore TypeScript di farlo? Inoltre, non sono sicuro che sia pertinente, ma sto usando WebStorm.


Penso che le cose si complichino quando hai Editor Configuration / tsconfig / webpack config ... (sto solo raccontando i miei sentimenti ...)
Yarco

Risposte:


134

Usa l'opzione --outDirsu tsc (configurato all'interno di File Watcher in IntelliJ)

Dalla documentazione della riga di comando

--outDir DIRECTORY Redirect output structure to the directory.

modificare

A partire da Typescript 1.5, questo può essere impostato anche nel tsconfig.jsonfile:

"compilerOptions": {
    "outDir": "DIRECTORY"
    ...

Questo e 'esattamente quello che stavo cercando! Grazie mille, non posso credere di non averlo visto prima ...
TheGuyWithTheFace

3
Credo che ora puoi anche usare il --rootDirflag per passare una cartella principale comune al transpiler. Questo evita che trovi una cartella principale comune.
guzmonne

perché questa opzione deve essere system o amd? Non voglio che la build dipenda da loro.
Nikos

Tranne, questo sembra romperlo in 2.0? stackoverflow.com/a/40149682/550975
Serj Sagan

2
Funziona ancora? Non sembra funzionare durante la compilazione tramite webpack.
mattnedrich

30

Oppure aggiungi "outDir": "build"al file tsconfig.json


21
Nota: "outDir": "build"va "compilerOptions"nell'oggetto del tuo tsconfig.json, non come proprietà di primo livello.
Jamie

7

Sebbene queste risposte siano corrette, dovresti considerare se in realtà vuoi solo nascondere i tuoi file .js dal tuo IDE .

In Visual Studio Code, vai a File > Preferences > Settingso il tuo .vscode\settings.jsonfile e inserisci:

"files.exclude": {
    "**/.git": true,
    "**/.DS_Store": true,
    "**/*.js" : {
        "when": "$(basename).ts"
    },
    "**/*.js.map": {
        "when": "$(basename)"
    }
}

Quanto sopra nasconde i file .js in cui esiste un file .ts corrispondente.


2
So che è di un po 'di tempo fa, ma ero curioso, c'è un vantaggio nel non usare una cartella di build o stavi solo offrendo un'alternativa?
pace del

1
@theaceofthespade È utile se si desidera includere o leggere file nella cartella dei sorgenti relativi a __dirname. (Ad esempio un .graphqlfile schema)
janispritzkau

3

Se desideri mappare la struttura della directory della cartella app / scripts in js, ti suggerisco di utilizzare le seguenti impostazioni per il tuo file watcher:

Arguments: --sourcemap --outDir $ProjectFileDir$/js/$FileDirPathFromParent(scripts)$ $FileName$
Working Directory: $FileDir$
Output Paths To Refresh: $ProjectFileDir$/js/$FileDirPathFromParent(scripts)$/$FileNameWithoutExtension$.js:$ProjectFileDir$/js/$FileDirPathFromParent(scripts)$/$FileNameWithoutExtension$.js.map

1
Questo risolve effettivamente il problema con un file watcher, ma poiché questa funzione è deprecata e sostituita con il compilatore TypeScript, come si fa con il compilatore?
Nitzan Tomer

3

Utenti Intellij, compilare Typescript in più directory di output

Per gli utenti di Intellij questo può essere utile. È così che ho ottenuto che funzionasse utilizzando il compilatore di caratteri tipografici integrato.

Informazioni sull'ambiente

Struttura di directory di esempio

BEFORE COMPILE
----------------------------------------
-> JS
   -> app
      -> config.js  //this is not generated
   -> libs
      -> jquery.js  //this is not generated
   -> plugins
-> TS
   -> app
      -> main.ts
   -> libs
      -> jquery.d.ts
   -> plugins
      -> somePlugin.ts

AFTER COMPILE
----------------------------------------
-> JS
   -> app
      -> config.js  //this is not generated
      -> main.js
   -> libs
      -> jquery.js  //this is not generated
   -> plugins
      somePlugin.ts
-> TS
   -> app
      -> main.ts
   -> libs
      -> jquery.d.ts    //this is where I kept my definition files
   -> plugins
      -> somePlugin.ts

Installazione di Intellij

  • File -> Impostazioni -> Dattiloscritto
  • Interprete dei nodi: il percorso di installazione di NodeJS
  • Versione del compilatore: in genere si trova in C:\yourUserName\AppData\Roaming\npm\node_modules\typescript\lib
  • Opzioni della riga di comando: -m amd -t ES6 -outDir E:\myapp\js
  • Seleziona solo il file principale di compilazione e indirizzalo al file di immissione. E:\myapp\ts\main.tsSe questo non è selezionato, tutti i tuoi file proveranno ad essere inviati al tuo percorso outDir.

inserisci qui la descrizione dell'immagine


3

Ho impostato package.json in questo modo in modo che la digitazione npm run startrestituisca tutto a build. I file di origine vengono conservati in formato src. Il file di output è specificato da --outDir build.

{
  "name": "myapp",
  "version": "0.0.1",
  "scripts": {
    "tsc": "tsc",
    "tsc:w": "tsc -w --outDir build",
    "lite": "lite-server",
    "start": "concurrent \"npm run tsc:w\" \"npm run lite\" "
  },
  "license": "private",
  "dependencies": {
    "angular2": "2.0.0-beta.0",
    "systemjs": "0.19.6",
    "es6-promise": "^3.0.2",
    "es6-shim": "^0.33.3",
    "reflect-metadata": "0.1.2",
    "rxjs": "5.0.0-beta.0",
    "zone.js": "0.5.10"
  },
  "devDependencies": {
    "concurrently": "^1.0.0",
    "lite-server": "^1.3.1",
    "typescript": "^1.7.3"
  }
}

Puoi escludere la tua directory di build in tsconfig.json, anche se probabilmente non è necessario, poiché c'è solo JS lì:

{
  "compilerOptions": {
    "target": "ES5",
    "module": "system",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  },
  "exclude": [
    "node_modules",
    "build"
  ]
}

1

Sto usando Atom con l'estensione atom-typescript e il mio tsconfig.json ha questo aspetto:

{
  "compilerOptions": {
    "outDir":"js"
  }
}

-1

Per quanto riguarda Grunt, attualmente per salvare la struttura del progetto della cartella dev in produzione e non ottenere un risultato imprevisto dopo la compilazione dei file, fare riferimento all'opzione:

compilerOptions: { 
 rootDir: 'devFolder'
 // ...
}

Vedi il file rootDir opzione nei documenti ufficiali di grunt-ts.

Spero che possa aiutare qualcuno se si blocca e ottiene uno strano risultato nella produzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.