Titanium + Alloy + TypeScript1.0RC のコンパイル

  • 8
    Like
  • 0
    Comment
More than 1 year has passed since last update.

概要

2014年02月25日に TypeScript1.0RC(compilerVersion 0.9.7) が公開されました。
Announcing TypeScript 1.0RC

Titanium + Alloy + TypeScript1.0RC のコンパイル方法を調べても情報を見つけられなかったので、自分でなんとかコンパイルできるようにしました。

環境

MacOS X 10.9.2
Titanium SDK 3.3.0
Alloy 1.3.1
TypeScript1.0RC

参考

以下の記事を参考にさせていただきました。
Titanium + Alloy + TypeScript で、iOS & Android アプリを作る

詳細

ファイルのコピー

Typescript インストールフォルダの tsc.js と lib.d.ts を
Alloy インストールフォルダ内の bin フォルダにコピーする。

私の環境では以下のpathです。
/usr/local/lib/node_modules/alloy/bin/

alloy.jmk の作成

alloy.jmk を編集して、tsc.js を読み込むようにする。

typescript.js ではなく、tsc.jsを使う。

wrench.readdirSyncRecursive のコードブロックの前にBatchCompilerのインスタンスの生成文を挿入。

alloy.jmk
var batch = new TypeScript.BatchCompiler(TypeScript.IO);

wrench.readdirSyncRecursive のコードブロックの中で、各ファイルのパスをBatchCompilerのinputFiles配列に追加する。

alloy.jmk
batch.inputFiles.push(filename);

wrench.readdirSyncRecursive のコードブロックの後にBatchCompilerのcompile実行文を追加。

alloy.jmk
batch.batchCompile(); 

完成した alloy.jmk は以下の通り。

alloy.jmk
task("pre:compile", function(event,logger) {
    var wrench = require("wrench"),
        fs = require("fs"),
        path = require("path");

    var code = [
        fs.readFileSync("/usr/local/lib/node_modules/alloy/bin/tsc.js"), // <- path to tsc.js in your environment
        "module.exports = TypeScript;"
    ].join("");
    fs.writeFileSync(process.env.TMPDIR + "tsc.js", code);
    var TypeScript = require(process.env.TMPDIR + "tsc.js");
    fs.unlinkSync(process.env.TMPDIR + "tsc.js");

    event.alloyConfig.tsc = [];

    var batch = new TypeScript.BatchCompiler(TypeScript.IO);
    wrench.readdirSyncRecursive(event.dir.home).forEach(function(target){
        if (target.match(/\.ts$/) && ! target.match(/\.d\.ts$/)) {
            var filename = path.join(event.dir.home + "/" + target);
            batch.inputFiles.push(filename);
            event.alloyConfig.tsc.push(target.replace(/.ts$/, ".js"));
        }
    });
    batch.batchCompile();
});

task("post:compile",function(event,logger){
  var fs = require("fs");

  event.alloyConfig.tsc.forEach(function(target){
    fs.unlinkSync(event.dir.home + "/" + target);
  });
});

tsc.js の編集

Alloy インストールフォルダ内の bin フォルダにコピーした tsc.js を編集する。

ファイルの末尾付近のBatchCompiler実行文をコメントアウトする。

tsc.js
//var batch = new TypeScript.BatchCompiler(TypeScript.IO);
//batch.batchCompile();

BatchCompilerクラスのparseOptionsメソッド定義文の後半 opts.parse(this.ioHost.arguments) の前に
1文追加して余分なoptionを除外する。

tsc.js
this.ioHost.arguments = this.ioHost.arguments.filter(function(arg) { 
    return arg !== '--config';
});

BatchCompilerクラスのresolveメソッド定義文の前半 var resolutionResults = ... の前に
1文追加して余分なargumentsを除外する。

tsc.js
this.inputFiles = this.inputFiles.filter(function(file) { 
    return file.match(/\.ts$/);
});

ログの出力をする場合は、CompilationSettingsクラスのコンストラクタ内 this.gatherDiagnostics = false; -> trueに変更する。
プロパティのget/setアクセサメソッドを使用する場合は
this.codeGenTarget = 0; -> 1に変更してECMAScript5をターゲットにする。

追記

Announcing TypeScript 1.0
TypeScript1.0 でも同様にコンパイルできました。