Як переглядати та компілювати всі джерела TypeScript?


83

Я намагаюся перетворити проект домашньої тварини на TypeScript, і, здається, не можу користуватися tscутилітою для перегляду та компіляції своїх файлів. Довідка говорить, що я повинен використовувати -wперемикач, але схоже, він не може *.tsрекурсивно переглядати та компілювати всі файли в якомусь каталозі. Здається, з цим щось tscповинно впоратися. Які у мене варіанти?

Відповіді:


120

Створіть файл із іменем tsconfig.jsonу корені проекту та включіть у нього такі рядки:

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

Зверніть увагу, що це outDirповинен бути шлях до каталогу для отримання скомпільованих файлів JS, а rootDirтакож шлях до каталогу, що містить ваші вихідні (.ts) файли.

Відкрийте термінал і запустіть tsc -w, він скомпілює будь-який .tsфайл у srcкаталозі .jsта збереже їх у ts-builtкаталозі.


1
Дякую за це рішення. Одне невеличке оновлення: tscвиникла помилка, error TS6050: Unable to open file 'tsconfig.json'.поки я не видалив коментарі
Гаррет Маккаллоу

@gwmccull: Ах, я додав їх лише сюди, щоб читачі знали, що до чого. Я оновлю відповідь.
budhajeewa

Коментарі були корисними. Просто мені знадобилася хвилина, щоб зрозуміти, чому це не спрацює. Нова примітка теж працює. Дякую за відповідь!
Гаррет Маккаллоу

7
Про всяк випадок, коли хтось його шукає. Примітка за цим посиланням: github.com/Microsoft/TypeScript/wiki/tsconfig.json "Якщо у tsconfig.json немає властивості" files ", компілятор за замовчуванням включає всі файли TypeScript (* .ts або * .tsx) у каталозі та підкаталогах, що містять. Коли присутня властивість "files", включаються лише вказані файли. "
Кері Уокер

1
замість того, щоб встановити єдиний вихідний каталог за допомогою compilerOptions.rootDir, ви можете вказати декілька вихідних каталогів із властивістю tsconfig include:{ "compilerOptions": { ...myOptions }, "include": [ "src", "otherSrc" ] }
JP Lew

27

TypeScript 1.5 beta представила підтримку файлу конфігурації під назвою tsconfig.json. У цьому файлі ви можете налаштувати компілятор, визначити правила форматування коду і, що більш важливо для вас, надати йому інформацію про файли TS у вашому проекті.

Після правильного налаштування ви можете просто запустити команду tsc і змусити її скомпілювати весь код TypeScript у вашому проекті.

Якщо ви хочете, щоб він стежив за файлами змін, ви можете просто додати --watch до команди tsc.

Ось приклад файлу tsconfig.json

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

У наведеному вище прикладі я включаю всі файли .ts у свій проект (рекурсивно). Зверніть увагу, що ви також можете виключити файли, використовуючи властивість "виключити" з масивом.

Для отримання додаткової інформації зверніться до документації: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html


2
Чи справді реалізований синтаксис glob? Цього немає в схемі
Сергузест

2
Насправді ні; З тих пір я виявив, що глобуси все ще обговорюються. filesGlob підтримується лише редактором Atom. Наразі ви можете вказати властивості "файли" та "виключити".
dSebastien

2
Питання, на яке слід стежити, полягає в наступному: github.com/Microsoft/TypeScript/pull/3232
dSebastien

17

Ви можете переглядати всі файли, подібні до цього

tsc *.ts --watch

4
"Файл '* .ts' не знайдено" - це те, що я отримую, якщо застосувати це рішення у вузлі. Будь-які думки з цього приводу?
Самі

8

Технічно кажучи, у вас є кілька варіантів тут:

Якщо ви використовуєте IDE, наприклад Sublime Text та інтегрований плагін MSN для Typescript: http://blogs.msdn.com/b/interoperable/archive/2012/10/01/sublime-text-vi-emacs-typescript-enabled. aspx ви можете створити систему збірки, яка автоматично компілює .tsджерело .js. Ось пояснення, як це можна зробити: Як налаштувати систему Sublime Build для TypeScript .

Ви можете визначити навіть для компіляції вихідного коду до цільового .jsфайлу при збереженні файлу. Існує піднесений пакет, розміщений на github: https://github.com/alexnj/SublimeOnSaveBuild, який робить це можливим, лише вам потрібно включити tsрозширення у SublimeOnSaveBuild.sublime-settingsфайл.

Іншою можливістю буде компіляція кожного файлу в командному рядку. Ви можете зібрати навіть кілька файлів одночасно, розділяючи їх пробілами подобається так: tsc foo.ts bar.ts. Перевірте цю тему: Як я можу передати декілька вихідних файлів компілятору TypeScript? , але я думаю, що перший варіант є більш зручним.


6

Компілятор tsc буде переглядати лише ті файли, які ви передаєте в командному рядку. Він не буде переглядати файли, включені за допомогою /// <sourcefile>посилання. Якщо ви працюєте з bash, ви можете використовувати find для рекурсивного пошуку всіх *.tsфайлів та їх компіляції:

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

6

Подивіться на використання grunt для автоматизації цього, навколо є безліч підручників, але ось швидкий початок.

Для структури папок, наприклад:

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

Ви можете легко переглядати та працювати з машинописом із папки прикладів за допомогою:

npm install
grunt

За допомогою 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"
  }
}

І файл бурчання:

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

tsc 0.9.1.1, схоже, не має функції перегляду .

Ви можете використовувати сценарій PowerShell, такий як той:

#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 >  

Посилання: Автоматично переглядати та компілювати файли TypeScript .


1

Сьогодні я розробив цей Ant MacroDef для тієї ж проблеми, що і ваша:

    <!--
    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>

Використовуйте його у своєму файлі збірки з:

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

Він використовується в проекті PureMVC для TypeScript, над яким я працюю на той час за допомогою Webstorm.


Мурашиний мікроскрипт? Можливо, ви захочете розширити відповідь, щоб пояснити, як використовувати його як частину цього рішення ....
random_user_name

Я спробую зробити допис у блозі, даючи простий приклад, і зв’язати це тут. Якщо ви не можете зачекати, ось проект, де я його використовую github.com/tekool/puremvc-typescript-singlecore, для якого є повний файл збірки Ant: github.com/tekool/puremvc-typescript-singlecore/blob/ master /…
Tekool

0

РЕДАГУВАТИ: Примітка, це якщо у вас є кілька файлів tsconfig.json у джерелі вашого TypeScript. Для мого проекту у нас є кожен файл tsconfig.json, який компілюється в інший файл .js. Це робить перегляд кожного файлу машинопису дуже простим.

Я написав солодкий скрипт bash, який знаходить усі ваші файли tsconfig.json і запускає їх у фоновому режимі, а потім, якщо ви натиснете CTRL + C на терміналі, він закриє всі запущені команди перегляду машинопису.

Це тестується на MacOS, але має працювати де завгодно, коли підтримується BASH 3.2.57. Можливо, майбутні версії змінили деякі речі, тому будьте обережні!

#!/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

Корисні ресурси:


Як мати пробіли в рядку шляху до файлу в Bash: stackoverflow.com/a/16703720/9800782
Метт Віндхем,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.