Próbuję przekonwertować projekt pet na TypeScript i nie mogę używać tego tsc
narzędzia do oglądania i kompilowania moich plików. Pomoc mówi, że powinienem użyć -w
przełącznika, ale wygląda na to, że nie może *.ts
rekurencyjnie oglądać i kompilować wszystkich plików w jakimś katalogu. Wydaje się, że coś tsc
powinno sobie z tym poradzić. Jakie mam możliwości?
84
tsc
wystąpił błąd,error TS6050: Unable to open file 'tsconfig.json'.
dopóki nie usunąłem komentarzycompilerOptions.rootDir
, możesz określić wiele katalogów źródłowych za pomocąinclude
właściwości tsconfig :{ "compilerOptions": { ...myOptions }, "include": [ "src", "otherSrc" ] }
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
źródło
możesz oglądać wszystkie takie pliki
źródło
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
.js
pliku 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ćts
rozszerzenie doSublimeOnSaveBuild.sublime-settings
pliku.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.źródło
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*.ts
pliki i skompilować je:find . -name "*.ts" | xargs tsc -w
źródło
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:
Możesz łatwo oglądać i pracować z maszynopisem z przykładowego folderu za pomocą:
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']); }
źródło
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 .
źródło
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.
źródło
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:
źródło