11

私がやりたいノードアプリ内から:

var typeScript = require('typescript'); 

typeScript.compile('...')

コンパイラをビルド システムに実装しようとしていますが、パブリック API (typescript.compile など) にアクセスできないため、これは不可能です。

これは私がやりたいことのより完全な例ですが、以下はBrunch.ioビルドシステム用に書かれたプラグインで利用されたTypeScriptではなくLiveScript用です:

LiveScript = require 'LiveScript'
sysPath = require 'path'

module.exports = class LiveScriptCompiler
  brunchPlugin: yes
  type: 'javascript'
  extension: 'ls'

  constructor: (@config) ->
    null

  compile: (data, path, callback) ->
    try
      result = LiveScript.compile data, bare: yes
    catch err
      error = err
    finally
      callback error, result

  include: [
    (sysPath.join __dirname, '..', 'vendor', 'prelude-browser-0.6.0.js')
  ]

誰かが回避策を見つけたら興味がありますか?

アップデート

上記および他の場所にリストされているさまざまな問題に対する独自のソリューションを実装することになりました。詳細と使用方法 については、 https://github.com/damassi/TypeScript-Watcherを参照してください。

4

5 に答える 5

8

これは少しハックですが、うまくいきます。

昨日も同じことを考えていて、彼らのコードをチェックしていました。ソースコードから bin/typscript.js を確認すると (これは非常に大きなファイルで、21,000 行近くのコードがあります)、TypeScript.TypeScriptCompiler が作成されていることがわかります。そして、これがコンパイル方法を公開していることがわかります。 .

var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile, 
    new TypeScript.NullLogger(), settings);

ここで、それを公開する簡単な方法が必要です。これを行うには、コードを変更する必要があります。これがハッキーである理由です。これを行うには、次を追加して typescript.js を変更できます。

module.exports = exports = TypeScript;

ファイルの最後にあります。

次に、モジュールのルートに index.js ファイルを作成できます (注意: このすべてのモジュールをローカル スコープにインストールします: "npm install typescript")。これにより、オブジェクトが公開されます。

exports.TypeScript = require("bin/typescript");

そして準備完了!これで、それを呼び出して、それを使用してコードをコンパイルできます。コンパイル用の API の使用方法は tsc.js ファイルで確認できます。

恐ろしいコードが先にあることを前もってお詫びします。

var fs = require("fs");
var TypeScript = require("typescript");
var path = "test.ts";
var pathout = "test.js";
var content = fs.readFileSync(path, "utf-8");
var fd = fs.openSync(pathout, 'w'); 
var outFile = { 
    Write: function (str) { 
        fs.writeSync(fd, str); 
    }, 
    WriteLine: function (str) {
    console.log(fd, str); 
        fs.writeSync(fd, str + '\r\n'); 
    }, 
    Close: function () { 
        fs.closeSync(fd); 
        fd = null; 
    } 
};
var createFile = function (path) { 
    function mkdirRecursiveSync(path) { 
        var stats = fs.statSync(path); 
        if(stats.isFile()) { 
            throw "\"" + path + "\" exists but isn't a directory."; 
        } else { 
            if(stats.isDirectory()) { 
                return; 
            } else { 
                mkdirRecursiveSync(_path.dirname(path)); 
                fs.mkdirSync(path, 509); 
            } 
        } 
    } 
    mkdirRecursiveSync(_path.dirname(path));
    console.log(path) 
    var fd = fs.openSync(path, 'w'); 
    return { 
        Write: function (str) { 
            fs.writeSync(fd, str); 
        }, 
        WriteLine: function (str) { 
            fs.writeSync(fd, str + '\r\n'); 
        }, 
        Close: function () { 
            fs.closeSync(fd); 
            fd = null; 
        } 
    }; 
};
var stderr = { 
    Write: function (str) { 
        process.stderr.write(str); 
    }, 
    WriteLine: function (str) { 
        process.stderr.write(str + '\n'); 
    }, 
    Close: function () { 
    } 
}
var compiler = new TypeScript.TypeScriptCompiler(outFile, outFile);
compiler.setErrorOutput(stderr);
compiler.addUnit(content, path);
compiler.typeCheck();
compiler.emit(false, createFile);
outFile.Close();

何らかの理由で、コードを書いた人は C# の真のファンであり、実際には単なるラッパーである WriteLine、Close、および Write と呼ばれるメソッドを使用するようになりました。この関数を追加しなければならないというオーバーヘッドを得ることができますが、モジュール内の多くのコードを変更する必要があり、その価値はありません。拡張するクラスを用意し (または、まだ JS を使用している場合はプロトタイプを継承し)、それを実行させて DRY にするのが最善だと思います。

本当に素晴らしいのは、500 個の TypeScript ファイルを変換してそれらすべてを 1 つの .js ファイルに入れたい場合、単に compiler.addUnit(anothercontent, anotherpath); を呼び出すことができるということです。500回、それがすべて単一のファイルに入るのを見てください:)

より良いことに焦点を当てる: tsc.js コードをチェックすると、バッチ コンパイラ クラスが見つかります。ビルド プロセスでこれが必要な場合は、このようなより堅牢なものを使用することをお勧めします。ファイルの監視などを提供します。

コードを閲覧したので、開発チームにチケットを送信して、より明確な API を提供するよう依頼するだけだと思います ¬¬

注: ここでのすべてのファイルの読み取りは、同期的に行われます。これは、パフォーマンスの点で悪い、非常に悪いです。あなたが何をしようとしているのか正確にはわかりませんが、可能であれば、これを非同期にする方法を見つけることをお勧めできません。

于 2012-10-03T22:52:12.067 に答える
2

現在、require を実行して compile を呼び出すだけでは、コンパイルを実行することはできません。Harness.ts を見ることができる場合は、かなり単純な方法を提供するコンパイラ モジュールがありますが、外部で tsc を呼び出すことをお勧めします。

///<reference path='node.d.ts'/>
import exec = module('child_process');

var child = exec.exec('tsc foo.ts',
  function (error, stdout, stderr) {
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

これでうまくいくと思います。

于 2012-10-03T22:01:24.873 に答える
1

niutech によるこの github プロジェクトを確認してください。ブラウザでTypeScript コードをオンザフライで JS コードに変換できますが、node.js で動作するように簡単に変更できると思います。

于 2012-10-07T06:41:23.923 に答える
1

タイプスクリプトファイルの実行/アクセスだけが必要な場合は、better-requireがこれを達成するのに役立ちます。

typescript ファイルを require() することができます - プリコンパイルは必要ありません - および他のファイル形式 (coffeescript、clojurescript、yaml、xml など) の束。

require('better-require')();
var myModule = require('./mymodule.ts');

開示:better-requireと書きました。

于 2012-11-01T15:06:06.687 に答える
1

https://github.com/sinclairzx81/typescript.apiを試すことができます。このプロジェクトは require() 拡張機能を実行しますが、ts ソースを手動でコンパイルする機能も備えています。それを使用して自動ビルドシステムを作成できるはずです。

typescript 0.9 コンパイラに基づいて構築されていることに注意してください。そのため、言語にさまざまな更新が加えられた場合、0.8.3 ソースのコンパイルに成功する場合と成功しない場合があります。

于 2013-05-13T11:03:54.397 に答える