Wie kann ich den Typescript-Compiler dazu bringen, die kompilierten js in ein anderes Verzeichnis auszugeben?

119

Ich bin ziemlich neu in TypeScript und im Moment habe ich an mehreren Stellen .ts-Dateien in meiner Projektstruktur:

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

Wenn meine Dateien kompiliert werden, werden sie derzeit in dasselbe Verzeichnis kompiliert, in dem sich die .ts-Dateien befinden:

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

Obwohl mir die Art und Weise gefällt, wie die .js-Dateien dieselbe Verzeichnisstruktur wie die .ts-Dateien beibehalten, möchte ich die .js-Dateien in meinem VCS nicht verfolgen, daher möchte ich alle meine JavaScript-Dateien in a behalten separater Verzeichnisbaum (den ich dann zu .gitignore hinzufügen kann), wie folgt:

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

Gibt es irgendwo eine Einstellung oder Option, die den TypeScript-Compiler dazu auffordert? Ich bin mir auch nicht sicher, ob es relevant ist, aber ich verwende WebStorm.

TheGuyWithTheFace
quelle
Ich denke, die Dinge werden kompliziert, wenn Sie Editor-Konfiguration / tsconfig / webpack config haben ... (nur über mein Gefühl erzählen ...)
Yarco

Antworten:

134

Verwenden Sie die Option --outDirauf tsc (konfiguriert im File Watcher in IntelliJ).

Aus der Befehlszeilendokumentation

--outDir DIRECTORY Redirect output structure to the directory.

Bearbeiten

Seit Typescript 1.5 kann dies auch in der tsconfig.jsonDatei festgelegt werden:

"compilerOptions": {
    "outDir": "DIRECTORY"
    ...
Bruno Grieder
quelle
Genau das habe ich gesucht! Vielen Dank, ich kann nicht glauben, dass ich es vorher nicht gesehen habe ...
TheGuyWithTheFace
3
Ich glaube, dass Sie jetzt auch das --rootDirFlag verwenden können, um einen gemeinsamen Stammordner an den Transpiler zu übergeben. Dadurch wird vermieden, dass ein gemeinsamer Stammordner gefunden wird.
Guzmonne
Warum muss diese Option system oder amd sein? Ich möchte nicht, dass der Build von ihnen abhängt.
Nikos
Außer, das scheint es in 2.0 zu brechen? stackoverflow.com/a/40149682/550975
Serj Sagan
2
Funktioniert das noch Es scheint nicht zu funktionieren, wenn über Webpack erstellt wird.
Mattnedrich
30

Oder fügen "outDir": "build"Sie der Datei tsconfig.json hinzu

Qingshan
quelle
21
Hinweis: Geht "outDir": "build"in das "compilerOptions"Objekt Ihrer Datei tsconfig.json und nicht als Eigenschaft der obersten Ebene.
Jamie
7

Obwohl diese Antworten korrekt sind, sollten Sie überlegen, ob Sie Ihre .js-Dateien tatsächlich nur vor Ihrer IDE verbergen möchten .

Gehen Sie in Visual Studio Code zu File > Preferences > Settingsoder zu Ihrer .vscode\settings.jsonDatei und geben Sie Folgendes ein:

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

Das obige versteckt .js-Dateien, in denen eine entsprechende .ts-Datei vorhanden ist.

Dave Clark
quelle
2
Ich weiß, dass dies schon eine Weile her ist, aber ich war neugierig, ob es von Vorteil ist, keine Build-Ordner zu verwenden, oder haben Sie nur eine Alternative angeboten?
Frieden des Spaten
1
@theaceofthespade Es ist nützlich, wenn Sie Dateien in Ihren Quellordner relativ zu aufnehmen oder lesen möchten __dirname. (Zum Beispiel eine .graphqlSchemadatei)
Janispritzkau
3

Wenn Sie die Verzeichnisstruktur des Ordners app / scripts in js zuordnen möchten, empfehlen wir Ihnen, die folgenden Einstellungen für Ihren Datei-Watcher zu verwenden:

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
Lena
quelle
1
Dies löst zwar das Problem mit einem Datei-Watcher, aber wie wird es mit dem Compiler gemacht, da diese Funktion veraltet ist und durch den TypeScript-Compiler ersetzt wird?
Nitzan Tomer
3

Intellij-Benutzer kompilieren Typescript in mehrere Ausgabeverzeichnisse

Für Intellij-Benutzer kann dies nützlich sein. So habe ich das mit dem eingebauten Typescript Compiler zum Laufen gebracht.

Umgebungsinfo

Beispiel für eine Verzeichnisstruktur

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

Intellij Setup

  • Datei -> Einstellungen -> Typoskript
  • Node Interpreter: Ihr NodeJS-Installationspfad
  • Compiler-Version: befindet sich normalerweise unter C:\yourUserName\AppData\Roaming\npm\node_modules\typescript\lib
  • Befehlszeilenoptionen: -m amd -t ES6 -outDir E:\myapp\js
  • Aktivieren Sie die Option Nur Hauptdatei kompilieren und verweisen Sie auf Ihre Eingabedatei. E:\myapp\ts\main.tsWenn dies nicht aktiviert ist, versuchen alle Ihre Dateien, in Ihren outDir-Pfad auszugeben.

Geben Sie hier die Bildbeschreibung ein

Kris Hollenbeck
quelle
3

Ich richte package.json so ein, dass beim Tippen npm run startalles ausgegeben wird build. Die Quelldateien bleiben in src. Die Outfile wird durch angegeben --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"
  }
}

Sie können Ihr Build-Verzeichnis in tsconfig.json ausschließen, obwohl dies wahrscheinlich nicht erforderlich ist, da dort nur JS vorhanden ist:

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

Ich benutze Atom mit der atom-typescript-Erweiterung und meine tsconfig.json sieht so aus:

{
  "compilerOptions": {
    "outDir":"js"
  }
}
Daveman
quelle
-1

In Bezug auf Grunt, um derzeit die Projektstruktur Ihres Entwicklungsordners in der Produktion zu speichern und nach dem Kompilieren der Dateien kein unerwartetes Ergebnis zu erhalten, lesen Sie bitte die Option:

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

Siehe rootDir Option in den offiziellen Grunt-ts-Dokumenten.

Ich hoffe, es hilft jemandem, wenn er stecken bleibt und ein seltsames Ergebnis in der Produktion erzielt.

Vladislav Stuk
quelle