読者です 読者をやめる 読者になる 読者になる

TypeScriptのコンパイルに node も Visual Studio も必要ない(Windowsでは)

この内容は TypeScript 0.8.2 をもとに記述しています。

TypeScriptをコンパイルするための環境を作るのに Windows 環境でかつ Visual Studio を利用されている型は TypeScript for Visual Studio 2012 をインストールするか、またはそれ以外の環境では node をインストールして npm から typescript を取ってくる(npm install -g typescript)かします。

今回は実はその両方とも必要ないってお話です。メモ帳とIEさえあれば git も node も Visual Studio もいらないってお話です。但し Windows 限定。

TypeScript のコンパイラJavaScript で書かれているってのはそこらへんに書かれてる話ですが、じゃ、その JavaScript の実行環境は何を利用されているかっていうと、node は有名どころとして、実は WSH も実行環境として動作するように構築されています。

tsc.js という、 tsc コマンドの実装部分のファイルの 25084 行目あたりを確認すると以下のようになっています。

if(typeof ActiveXObject === "function") {
    return getWindowsScriptHostIO();
} else {
    if(typeof require === "function") {
        return getNodeIO();
    } else {
        return null;
    }
}

ActiveXObject があると getWindowsScriptHostIO 関数を呼んでます。つまり、WSH を利用する IO 処理です。

ということで、コマンドラインから cscript でこの tsc.js を呼んでやると、 typeof ActiveXObject === "function" が true になって、 WSH を利用する IO が利用されます。

ということで、バッチファイルを作ってみましょう。

まずはブラウザで TypeScript のリポジトリを開いて、左のツリーから [bin] - [tsc.js] を選択します。以下のような感じ。
f:id:k_maru:20130203193755p:plain
で、右ペインに表示されている tsc.js のコードをコピーして、ローカルのファイルとして保存します。ファイル名はもちろん tsc.js ですね。

次にブラウザで tsc.js と同じ階層にある、 lib.d.ts も同じようにコードをコピーして、ローカルにファイルとして保存します。もちろん tsc.js と同じディレクトリです。

f:id:k_maru:20130203194235p:plain

で、同じディレクトリにバッチファイルを作ります。ここでは tscw.cmd としておきます。中は以下の一行で。

cscript "%~dp0\tsc.js" %*

あとは、このディレクトリに Path を通して、作った tscw.cmd がどこからでも叩けるようにしておきましょう。tscw をコマンドラインから叩いたスクリーンショットを載せておきます。

f:id:k_maru:20130203194940p:plain

node や TypeScript for Visual Studio 2012 のインストールが難しい方はご利用ください。

ちなみに TypeScript for Visual Studio 2012 で入る tsc.exe も内部的には WSH を利用して動かしてるみたいです。 tsc.exe と同じフォルダにある tsc.js の先に書いた JavaScript の判定部分を以下のようにして、 tsc.exe を実行すると見事に ActiveX のほうのコードが通っていることを確認できると思います。

if(typeof ActiveXObject === "function") {
    // 以下追加
    WScript.StdOut.Write("ActiveX");
    return getWindowsScriptHostIO();
} else {
    if(typeof require === "function") {
        //以下追加
        console.log("node");
        return getNodeIO();
    } else {
        return null;
    }
}