Flex SDK に含まれる AIR 開発用の adl コマンドを使って、ActionScript で簡単なコマンドラインツールが作れることに気が付きました。
コンソールに Hello, world! と引数の中身を適当に出力するツールは、こんな感じで実装出来ます。
コマンドラインツールなので、最後に exit() を呼んでやる必要があります。
引数は InvokeEvent 経由で受け取るようになっています。
// hello.as
package {
import flash.desktop.NativeApplication;
import flash.display.Sprite;
import flash.events.InvokeEvent;
import mx.utils.ObjectUtil;
public class hello extends Sprite
{
public function hello()
{
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, initialize);
}
private function initialize(event:InvokeEvent):void
{
trace("--------------------------------------------------------------------------------");
trace("Hello, world!");
trace("");
// コマンドライン引数を受け取る
var args:Array = event.arguments;
trace(ObjectUtil.toString(args));
trace("");
NativeApplication.nativeApplication.exit();
}
}
}
// hello-app.xml <?xml version="1.0" encoding="UTF-8"?> <application xmlns="http://ns.adobe.com/air/application/1.5"> <id>HelloASCommandLineTool</id> <filename>hello</filename> <name>hello</name> <version>v1</version> <initialWindow> <content>hello.swf</content> </initialWindow> </application>
後は、これを適当に amxmlc でコンパイルし、adl で実行するだけです。
% amxmlc -output hello.swf hello.as Loading configuration file /Applications/Adobe Flex Builder 3/sdks/3.2.0/frameworks/air-config.xml hello.swf (14304 bytes)
% adl hello-app.xml -- Hoge Fuga "`pwd`" -------------------------------------------------------------------------------- Hello, world! (Array)#0 [0] "Hoge" [1] "Fuga" [2] "/Users/yoshizu/Desktop/ASCLTool"
ちなみに、trace ログの出力は、mm.cfg で flashlog.txt に書き込まれるようにしている場合は、flashlog.txt に向きます。mm.cfg 作っていない場合は、そのままコンソールに出力されます。
ただ、このままだと hello-app.xml を置いているディレクトリを使う時にいちいち意識しないといけないので、簡単なラッパーとなるシェルスクリプトを作っておいて、パスが通る場所に置いておくと便利です。
今回は、ホームディレクトリ以下にこんな構成で配置しました。
bin
|- as
|- astools
|- hello
|- hello.as
|- hello-app.xml
|- hello.swf
#!/bin/sh
if [ ${1:-0} = 0 ]
then
echo "usage: % as hello"
exit
fi
path=${0%/*}
adl ${path}/astools/${1}/${1}-app.xml -- $2 $3 $4 $5 $6 $7 $8 $9
exit
すると、こんな風にどこからでも叩けるようになりました。
% as hello Hoge Fuga "`pwd`" -------------------------------------------------------------------------------- Hello, world! (Array)#0 [0] "Hoge" [1] "Fuga" [2] "/Users/yoshizu/Desktop"
違うツールを作った時にも、astools 以下に放り込んでおけば、as コマンドは共通して使えるので便利です。
--
追記 (2009.05.15)
mm.cfg で trace が flashlog.txt にいってしまう人は、一時的に mm.cfg の中身を書き換えてあげるとコンソールに trace が表示されるようになります。
#!/bin/sh
function replace
{
sed -e $1 $2 > $3
mv $3 $2
return 0;
}
mm=${HOME}/mm.cfg
path=${0%/*}
if [ ${1:-0} = 0 ]
then
echo "usage: % as hello"
exit
fi
replace "s/^\(.*\)=1$/\1=0/g" $mm ${path}/as-tmp
adl ${path}/astools/${1}/${1}-app.xml -- $2 $3 $4 $5 $6 $7 $8 $9
replace "s/^\(.*\)=0$/\1=1/g" $mm ${path}/as-tmp
exit