How to watch and compile all TypeScript sources?

后端 未结 9 1245
挽巷
挽巷 2020-12-04 06:53

I\'m trying to convert a pet project to TypeScript and don\'t seem to be able to use the tsc utility to watch and compile my files. The help says I should use t

相关标签:
9条回答
  • 2020-12-04 07:51

    you can watch all files like this

    tsc *.ts --watch
    
    0 讨论(0)
  • 2020-12-04 07:53

    Today I designed this Ant MacroDef for the same problem as yours :

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

    Use it in your build file with :

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

    It is used in the project PureMVC for TypeScript I'm working on at the time using Webstorm.

    0 讨论(0)
  • 2020-12-04 07:54

    Look into using grunt to automate this, there are numerous tutorials around, but here's a quick start.

    For a folder structure like:

    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
    

    You can watch and work with typescript easily from the example folder with:

    npm install
    grunt
    

    With 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"
      }
    }
    

    And a grunt file:

    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']);
    }
    
    0 讨论(0)
提交回复
热议问题