Jak oglądać i kompilować wszystkie źródła TypeScript?


84

Próbuję przekonwertować projekt pet na TypeScript i nie mogę używać tego tscnarzędzia do oglądania i kompilowania moich plików. Pomoc mówi, że powinienem użyć -wprzełącznika, ale wygląda na to, że nie może *.tsrekurencyjnie oglądać i kompilować wszystkich plików w jakimś katalogu. Wydaje się, że coś tscpowinno sobie z tym poradzić. Jakie mam możliwości?

Odpowiedzi:


123

Utwórz plik o nazwie tsconfig.jsonw katalogu głównym projektu i umieść w nim następujące wiersze:

{
    "compilerOptions": {
        "emitDecoratorMetadata": true,
        "module": "commonjs",
        "target": "ES5",
        "outDir": "ts-built",
        "rootDir": "src"
    }
}

Pamiętaj, że outDirpowinna to być ścieżka do katalogu, w którym mają rootDirbyć zapisane skompilowane pliki JS, a także ścieżka do katalogu zawierającego pliki źródłowe (.ts).

Otwórz terminal i uruchom tsc -w, skompiluje dowolny .tsplik w srckatalogu .jsi zapisze je w ts-builtkatalogu.


1
Dzięki za to rozwiązanie. Jedna mała aktualizacja: tscwystąpił błąd, error TS6050: Unable to open file 'tsconfig.json'.dopóki nie usunąłem komentarzy
Garrett McCullough

@gwmccull: Ach, dodałem je tylko tutaj, aby czytelnicy wiedzieli, co jest. Zaktualizuję odpowiedź.
budhajeewa

Komentarze były pomocne. Zajęło mi tylko minutę, zanim zrozumiałem, dlaczego to nie zadziała. Nowa notatka też działa. Dziękuję za odpowiedź!
Garrett McCullough

7
Na wypadek, gdyby ktoś go szukał. Uwaga z tego linku: github.com/Microsoft/TypeScript/wiki/tsconfig.json „Jeśli w tsconfig.json nie ma właściwości„ files ”, kompilator domyślnie uwzględnia wszystkie pliki TypeScript (* .ts lub * .tsx) w zawierającym katalogu i podkatalogach. Gdy występuje właściwość "files", uwzględniane są tylko określone pliki. "
Carey Walker

1
zamiast ustawiać pojedynczy katalog źródłowy za pomocą compilerOptions.rootDir, możesz określić wiele katalogów źródłowych za pomocą includewłaściwości tsconfig :{ "compilerOptions": { ...myOptions }, "include": [ "src", "otherSrc" ] }
JP Lew

27

W języku TypeScript 1.5 beta wprowadzono obsługę pliku konfiguracyjnego o nazwie tsconfig.json. W tym pliku możesz skonfigurować kompilator, zdefiniować reguły formatowania kodu i, co ważniejsze, dostarczyć mu informacje o plikach TS w Twoim projekcie.

Po prawidłowym skonfigurowaniu możesz po prostu uruchomić polecenie tsc i skompilować cały kod TypeScript w projekcie.

Jeśli chcesz, aby przeglądał pliki pod kątem zmian, możesz po prostu dodać --watch do polecenia tsc.

Oto przykładowy plik tsconfig.json

{
"compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "declaration": false,
    "noImplicitAny": false,
    "removeComments": true,
    "noLib": false
},
"include": [
    "**/*"
],
"exclude": [
    "node_modules",
    "**/*.spec.ts"
]}

W powyższym przykładzie dołączam wszystkie pliki .ts do mojego projektu (rekurencyjnie). Pamiętaj, że możesz również wykluczyć pliki za pomocą właściwości „exclude” z tablicą.

Więcej informacji można znaleźć w dokumentacji: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html


2
Czy naprawdę zaimplementowano składnię glob? Nie ma tego w schemacie
Serguzest

2
Właściwie nie; Od tego czasu odkryłem, że wzorce globów są nadal przedmiotem dyskusji. filesGlob jest obsługiwany tylko przez edytor Atom. Na razie możesz określić właściwości „plików” i „wykluczeń”.
dSebastien,

2
Kwestia, na którą należy zwrócić uwagę, jest następująca: github.com/Microsoft/TypeScript/pull/3232
dSebastien

18

możesz oglądać wszystkie takie pliki

tsc *.ts --watch

5
Jeśli zastosuję to rozwiązanie w węźle, otrzymam komunikat „Nie znaleziono pliku * .ts”. Jakieś przemyślenia na ten temat?
Sami

8

Technicznie rzecz biorąc, masz tutaj kilka opcji:

Jeśli używasz IDE, takiego jak Sublime Text i zintegrowanej wtyczki MSN dla Typescript: http://blogs.msdn.com/b/interoperability/archive/2012/10/01/sublime-text-vi-emacs-typescript-enabled. aspx można utworzyć system kompilacji, który automatycznie kompiluje .tsźródło .js. Oto wyjaśnienie, jak możesz to zrobić: Jak skonfigurować Sublime Build System dla TypeScript .

Możesz zdefiniować nawet kompilację kodu źródłowego do .jspliku docelowego przy zapisywaniu pliku. Istnieje wysublimowany pakiet hostowany na github: https://github.com/alexnj/SublimeOnSaveBuild, który to umożliwia, tylko Ty musisz dołączyć tsrozszerzenie do SublimeOnSaveBuild.sublime-settingspliku.

Inną możliwością byłoby skompilowanie każdego pliku w linii poleceń. Można skompilować nawet wielu plików naraz, rozdzielając je spacjami tak: tsc foo.ts bar.ts. Sprawdź ten wątek: Jak mogę przekazać wiele plików źródłowych do kompilatora TypeScript? , ale myślę, że pierwsza opcja jest bardziej przydatna.


6

Kompilator tsc będzie obserwował tylko te pliki, które przekażesz w wierszu poleceń. To będzie nie oglądać pliki, które są uwzględniane przy użyciu /// <sourcefile>odniesienia. Jeśli pracujesz z bashem, możesz użyć find, aby rekurencyjnie znaleźć wszystkie *.tspliki i skompilować je:

find . -name "*.ts" | xargs tsc -w

6

Przyjrzyj się używaniu gruntów do automatyzacji tego, istnieje wiele samouczków, ale oto szybki początek.

W przypadku struktury folderów, takiej jak:

blah/
blah/one.ts
blah/two.ts
blah/example/
blah/example/example.ts
blah/example/package.json
blah/example/Gruntfile.js
blah/example/index.html

Możesz łatwo oglądać i pracować z maszynopisem z przykładowego folderu za pomocą:

npm install
grunt

Z package.json:

{
  "name": "PROJECT",
  "version": "0.0.1",
  "author": "",
  "description": "",
  "homepage": "",
  "private": true,
  "devDependencies": {
    "typescript": "~0.9.5",
    "connect": "~2.12.0",
    "grunt-ts": "~1.6.4",
    "grunt-contrib-watch": "~0.5.3",
    "grunt-contrib-connect": "~0.6.0",
    "grunt-open": "~0.2.3"
  }
}

I plik gruntowy:

module.exports = function (grunt) {

  // Import dependencies
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-connect');
  grunt.loadNpmTasks('grunt-open');
  grunt.loadNpmTasks('grunt-ts');

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    connect: {
      server: {  // <--- Run a local server on :8089
        options: {
          port: 8089,
          base: './'
        }
      }
    },
    ts: {
      lib: { // <-- compile all the files in ../ to PROJECT.js
        src: ['../*.ts'],
        out: 'PROJECT.js',
        options: {
          target: 'es3',
          sourceMaps: false,
          declaration: true,
          removeComments: false
        }
      },
      example: {  // <--- compile all the files in . to example.js
        src: ['*.ts'],
        out: 'example.js',
        options: {
          target: 'es3',
          sourceMaps: false,
          declaration: false,
          removeComments: false
        }
      }
    },
    watch: { 
      lib: { // <-- Watch for changes on the library and rebuild both
        files: '../*.ts',
        tasks: ['ts:lib', 'ts:example']
      },
      example: { // <--- Watch for change on example and rebuild
        files: ['*.ts', '!*.d.ts'],
        tasks: ['ts:example']
      }
    },
    open: { // <--- Launch index.html in browser when you run grunt
      dev: {
        path: 'http://localhost:8089/index.html'
      }
    }
  });

  // Register the default tasks to run when you run grunt
  grunt.registerTask('default', ['ts', 'connect', 'open', 'watch']);
}

3

Wydaje się, że tsc 0.9.1.1 nie ma zegarka funkcji .

Możesz użyć skryptu PowerShell takiego jak ten:

#watch a directory, for changes to TypeScript files.  
#  
#when a file changes, then re-compile it.  
$watcher = New-Object System.IO.FileSystemWatcher  
$watcher.Path = "V:\src\MyProject"  
$watcher.IncludeSubdirectories = $true  
$watcher.EnableRaisingEvents = $true  
$changed = Register-ObjectEvent $watcher "Changed" -Action {  
  if ($($eventArgs.FullPath).EndsWith(".ts"))  
  {  
    $command = '"c:\Program Files (x86)\Microsoft SDKs\TypeScript\tsc.exe" "$($eventArgs.FullPath)"'  
    write-host '>>> Recompiling file ' $($eventArgs.FullPath)  
    iex "& $command"  
  }  
}  
write-host 'changed.Id:' $changed.Id  
#to stop the watcher, then close the PowerShell window, OR run this command:  
# Unregister-Event < change Id >  

Ref: Automatycznie oglądaj i kompiluj pliki TypeScript .


1

Dzisiaj zaprojektowałem ten Ant MacroDef na ten sam problem, co twój:

    <!--
    Recursively read a source directory for TypeScript files, generate a compile list in the
    format needed by the TypeScript compiler adding every parameters it take.
-->
<macrodef name="TypeScriptCompileDir">

    <!-- required attribute -->
    <attribute name="src" />

    <!-- optional attributes -->
    <attribute name="out" default="" />
    <attribute name="module" default="" />
    <attribute name="comments" default="" />
    <attribute name="declarations" default="" />
    <attribute name="nolib" default="" />
    <attribute name="target" default="" />

    <sequential>

        <!-- local properties -->
        <local name="out.arg"/>
        <local name="module.arg"/>
        <local name="comments.arg"/>
        <local name="declarations.arg"/>
        <local name="nolib.arg"/>
        <local name="target.arg"/>
        <local name="typescript.file.list"/>
        <local name="tsc.compile.file"/>

        <property name="tsc.compile.file" value="@{src}compile.list" />

        <!-- Optional arguments are not written to compile file when attributes not set -->
        <condition property="out.arg" value="" else='--out "@{out}"'>
            <equals arg1="@{out}" arg2="" />
        </condition>

        <condition property="module.arg" value="" else="--module @{module}">
            <equals arg1="@{module}" arg2="" />
        </condition>

        <condition property="comments.arg" value="" else="--comments">
            <equals arg1="@{comments}" arg2="" />
        </condition>

        <condition property="declarations.arg" value="" else="--declarations">
            <equals arg1="@{declarations}" arg2="" />
        </condition>

        <condition property="nolib.arg" value="" else="--nolib">
            <equals arg1="@{nolib}" arg2="" />
        </condition>

        <!-- Could have been defaulted to ES3 but let the compiler uses its own default is quite better -->
        <condition property="target.arg" value="" else="--target @{target}">
            <equals arg1="@{target}" arg2="" />
        </condition>

        <!-- Recursively read TypeScript source directory and generate a compile list -->
        <pathconvert property="typescript.file.list" dirsep="\" pathsep="${line.separator}">

            <fileset dir="@{src}">
                <include name="**/*.ts" />
            </fileset>

            <!-- In case regexp doesn't work on your computer, comment <mapper /> and uncomment <regexpmapper /> -->
            <mapper type="regexp" from="^(.*)$" to='"\1"' />
            <!--regexpmapper from="^(.*)$" to='"\1"' /-->

        </pathconvert>


        <!-- Write to the file -->
        <echo message="Writing tsc command line arguments to : ${tsc.compile.file}" />
        <echo file="${tsc.compile.file}" message="${typescript.file.list}${line.separator}${out.arg}${line.separator}${module.arg}${line.separator}${comments.arg}${line.separator}${declarations.arg}${line.separator}${nolib.arg}${line.separator}${target.arg}" append="false" />

        <!-- Compile using the generated compile file -->
        <echo message="Calling ${typescript.compiler.path} with ${tsc.compile.file}" />
        <exec dir="@{src}" executable="${typescript.compiler.path}">
            <arg value="@${tsc.compile.file}"/>
        </exec>

        <!-- Finally delete the compile file -->
        <echo message="${tsc.compile.file} deleted" />
        <delete file="${tsc.compile.file}" />

    </sequential>

</macrodef>

Użyj go w pliku kompilacji z:

    <!-- Compile a single JavaScript file in the bin dir for release -->
    <TypeScriptCompileDir
        src="${src-js.dir}"
        out="${release-file-path}"
        module="amd"
    />

Jest używany w projekcie PureMVC dla TypeScript , nad którym pracuję w tym czasie przy użyciu Webstorm.


Mikroscript Ant? Możesz rozszerzyć odpowiedź, aby wyjaśnić, jak wykorzystać to jako część tego rozwiązania ...
random_user_name

Postaram się napisać na blogu post z prostym przykładem i zamieścić link tutaj. Jeśli nie możesz się doczekać, oto projekt, w którym go używam github.com/tekool/puremvc-typescript-singlecore, dla którego kompletny plik kompilacji Ant to: github.com/tekool/puremvc-typescript-singlecore/blob/ master /…
Tekool

0

EDYCJA: Uwaga, dzieje się tak, jeśli masz wiele plików tsconfig.json w źródle skryptu. W moim projekcie każdy plik tsconfig.json jest kompilowany do innego pliku .js. To sprawia, że ​​oglądanie każdego pliku maszynopisu jest naprawdę łatwe.

Napisałem słodki skrypt bash, który znajduje wszystkie twoje pliki tsconfig.json i uruchamia je w tle, a następnie, jeśli naciśniesz CTRL + C terminal, zamknie on wszystkie uruchomione polecenia obserwacyjne.

Jest to testowane na MacOS, ale powinno działać wszędzie tam, gdzie obsługiwany jest BASH 3.2.57. Przyszłe wersje mogły zmienić pewne rzeczy, więc bądź ostrożny!

#!/bin/bash
# run "chmod +x typescript-search-and-compile.sh" in the directory of this file to ENABLE execution of this script
# then in terminal run "path/to/this/file/typescript-search-and-compile.sh" to execute this script
# (or "./typescript-search-and-compile.sh" if your terminal is in the folder the script is in)

# !!! CHANGE ME !!!    
# location of your scripts root folder
# make sure that you do not add a trailing "/" at the end!!
# also, no spaces! If you have a space in the filepath, then
# you have to follow this link: https://stackoverflow.com/a/16703720/9800782
sr=~/path/to/scripts/root/folder
# !!! CHANGE ME !!!

# find all typescript config files
scripts=$(find $sr -name "tsconfig.json")

for s in $scripts
do
    # strip off the word "tsconfig.json"
    cd ${s%/*} # */ # this function gets incorrectly parsed by style linters on web
    # run the typescript watch in the background
    tsc -w &
    # get the pid of the last executed background function
    pids+=$!
    # save it to an array
    pids+=" "
done

# end all processes we spawned when you close this process
wait $pids

Pomocne zasoby:


Jak mieć spacje w ciągu ścieżki pliku w Bash: stackoverflow.com/a/16703720/9800782
Matt Wyndham
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.