2012-10-03 5 views
11

:私はビルドシステムにはなく、パブリックAPI(typescript.compile、など)にアクセスすることなく、コンパイラを実装しているよTypeScriptはNodeJSモジュールアクセスのための明示的なパブリックAPIを提供しますか?私がやりたいノードのアプリの中から

var typeScript = require('typescript'); 

typeScript.compile('...') 

これは不可能です。

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') 
    ] 

興味ある場合:以下、LiveScriptためBrunch.ioは、ビルドシステムのために書かれたプラグインでutilitized活字体、ではないですが、ここで

は、私がやりたいもののより完全な例です誰も回避策を見つけた?

更新

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

答えて

8

これは少しハッキリですが、うまくいくでしょう。

私はちょうど昨日これについて考えましたが、私はコードをチェックしていました。 bin/typscript.jsをソースコードからチェックすると(21k行程度の非常に大きなファイルです)、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"); 

準備完了!今すぐ呼び出すことができ、それを使用してコードをコンパイルします。 tsc.jsファイルのコンパイルにAPIを使用する方法を確認できます。私は先に恐ろしいコードのために、事前に謝罪

:コードを書いた人は誰でも何らかの理由で

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メソッドと呼ばれるメソッドを使用し、閉じると書き込みを進め、どの実際にはラッパーでしかありません。この機能を追加しなければならないオーバーヘッドが発生する可能性がありますが、モジュール内の多くのコードを変更する必要があり、価値がありません。私はそれを拡張するクラスを持っていることをお勧めします(もしあなたがまだJSにいて、プロトタイプを継承していれば)それをあなたのためにして、それをDRYにしましょう。

本当に素敵なのは、500のTypeScriptファイルを翻訳して、それらをすべて1つの.jsファイルに入れたいのであれば、compiler.addUnit(anothercontent、anotherpath)を呼び出すことができます。 500回、それからすべてが単一のファイルに入ります:)

より良いことに焦点を当てます:tsc.jsコードをチェックすると、バッチコンパイラクラスが見つかります。これをビルドプロセスに使用する場合は、そのようなより堅牢なものを使用する方が良いかもしれません。これは、ファイルを監視するなどの機能を提供します。すべてのファイルはここで読み込み、同期方法で行われています。

コードを閲覧したので、私はちょうど開発チームにチケットを提出し、より明確なAPI¬¬

注意を提供するように依頼すると思います。これはパフォーマンス面で悪いですが、非常に悪いです。私はあなたが何をしようとしているのか正確にはわかりませんが、できるだけこれを非同期にする方法を見つけることをさらに勧められませんでした。

+0

優れた答え。あなたの例を楽しみにしています。 – cnp

+0

完了!ファイル名を変更するだけで(test.jsとtest.ts)、それに他のファイル名を付けると動作します。今のところ、エラー出力はprocess.stderrにリリースされますが、あなたはそれを使って何でもできます。また、ハンドラ関数をcompiler.setErrorCallbackとして追加することもできます。これにより、ビルドエラーに関するレポートを作成できます。 – Mamsaac

2

現在、requireとcallingをコンパイルするだけでコンパイルを行うことはできません。あなたが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); 
    } 
}); 

私はこれが仕事をすると思います。

+0

驚くばかりです。しましょう。 – cnp

+0

あなたはこの回答を削除することができます –

1

チェックthis github project niutechによって、それはブラウザフライにJSコードに活字体コードを変換することができますが、私は簡単にnode.js.で動作するように変更することができます推測

+0

私のプロジェクトに言及してくれてありがとう! – niutech

1

better-requireあなたが望むすべてがtypescriptファイルを実行している/アクセスしている場合は、これを達成するのに役立ちます。

は、それはあなたが()typescriptですファイルを必要とすることができます - 何の事前コンパイルは必要ありません - と他のファイル形式(CoffeeScriptの、clojurescript、YAML、XMLなど)

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

開示の束:私はより良い書きました〜が必要です。

+0

素晴らしいユーティリティ - 私はBrunch.ioアセンブラにパッチを当てようとして今試してみるつもりです。 – cnp

+0

ありがとう!気軽にリクエストしてください;)それはかなり簡単です。 –

1

https://github.com/sinclairzx81/typescript.apiを試すことができます。このプロジェクトはrequire()拡張機能を提供しますが、tsソースを手動でコンパイルする機能もあります。それを使って自動化されたビルドシステムを作ることが可能でなければなりません。

注:typescript 0.9コンパイラで構築されているので、言語に対するさまざまな更新があっても、0.8.3ソースをコンパイルすることができます。

関連する問題