Flex3のコンパイルをJRuby(jirb)でやってみよう
よくブログでmxmlcでMXMLやアクションスクリプトを使うとコンパイルに時間がかかるということが書かれているのを目にします。で、いろいろ調べてみるとfcsh(Flex3SDKには入っているみたい)を使うと2回目以降のコンパイルはすごいはやいらしい。
でも、なんかtarget idとか独自の世界観があるので、私にはとっつきにくい・・・。
でさらに見てみると、fcwrapというものがあるらしい。これはRubyで書かれているそうな。これはhttpdが起動していろいろしてくれるみたい。ただ、Ruby初心者以下の私にはWindowsで動かすのは大変そう・・・。
ってことで初心に戻って考えてみました。mxmlcがどうしておそいんでしょうか?ひょっとしてJavaの起動とかmxmlcの初期化とかでおそくなってたりしないんでしょうか?それならば、一度ロードさえしてしまえば早いんじゃない?
ここは最近出たJRubyでjirbを使って毎回コマンドたたけばいいんじゃないかなと思ったわけです。
長々書いていましたが、JRubyでmxmlcをたたいてみた記録を書いてみます。
用意するもの
- Flex3 SDK (私はC:\Flex3SDKに展開しました)
- JRuby 1.0 (私はC:\jruby-1.0に展開しました)
- コンパイルするお試しソース(適当にHelloWorld.as作りました)
package { import flash.display.*; import flash.text.*; public class HelloWorld extends Sprite { public function HelloWorld() { var hello:TextField = new TextField(); hello.text = "Hello world"; addChild(hello); } } }
バッチファイル
jirbを起動するためのバッチファイルを作ります。いろいろなパスは適当に置き換えてください。
rem 以下は適当に置き換えてください set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_11 set FLEX3_SDK_HOME=C:\Flex3SDK set JRUBY_HOME=C:\jruby-1.0 set PATH=%JAVA_HOME%\bin;%PATH% set PATH=%JRUBY_HOME%\bin;%PATH% set CLASSPATH=%FLEX3_SDK_HOME%\lib\mxmlc.jar jirb.bat
コンパイル
上のバッチファイルとHelloWorold.asは同じ場所においておいてください。たぶん、ちゃんとファイル名を指定すれば実行できると思いますが・・・。
以下実行後のログです
C:\flex3_workspaces\jruby_test>jirb.bat irb(main):001:0> require 'java' => true irb(main):002:0> include_class 'flex2.tools.Compiler' => ["flex2.tools.Compiler"] irb(main):003:0> a = java.lang.String[2].new => #<#<Class:01x1a99347>:0x11a01dd @java_object=[Ljava.lang.String;@1f31652> irb(main):004:0> a[0] = '+flexlib=/Flex3SDK/frameworks' => "+flexlib=/Flex3SDK/frameworks" irb(main):005:0> a[1] = 'HelloWorld.as' => "HelloWorld.as" irb(main):006:0> Compiler.mxmlc(a) Loading configuration file C:\Flex3SDK\frameworks\flex-config.xml This beta will expire on Wed Oct 31 00:00:00 JST 2007. C:\flex3_workspaces\jruby_test\HelloWorld.swf (619 bytes) => nil irb(main):007:0> Compiler.mxmlc(a) Loading configuration file C:\Flex3SDK\frameworks\flex-config.xml This beta will expire on Wed Oct 31 00:00:00 JST 2007. C:\flex3_workspaces\jruby_test\HelloWorld.swf (617 bytes) => nil
この例の"irb(main):xxx:0>"以降が入力したものです。
- "require 'java'"でjavaを呼び出せるようになるらしいです。
- "include_class 'flex2.tools.Compiler'"でCompilerクラスをjirbで呼び出せるようになるらしい。
- "a = java.lang.String[2].new"で引数に指定するためのString配列を用意します。今回は引数を2つ利用するので2を指定しました。
- "a[0] = '+flexlib=/Flex3SDK/frameworks'"これはおまじないみたいなものです。mxmlcのシェルスクリプトとかをのぞいてみてください。/Flex3SDKはFlexSDKのインストールディレクトリです。
- "a[1] = 'HelloWorld.as"でコンパイルするファイルを指定します。
- "Compiler.mxmlc(a)"でコンパイル開始です。何回もコンパイルするときでも、これを実行すればOKっぽい?!
ま、FlexもJRubyも勉強中なの闇雲に手をつけてみましたが、とりあえずできました。
で、大事な実行時間なのですが・・・、すこしだけ早くはなってると思う?!ただ、計測するための処理をかけなかったので、JRubyを勉強してから再度計測してみたいと思います。
(追加)fcshでも試してみましたが、明らかにfcshは早い・・・、なにをきゃっしゅしているのかな?