すがブロ

sugamasaoのhatenablogだよ

Flex3 で trace ログの出る、出ないを ant 経由で制御する方法

trace ログ垂れ流しの Flash って結構あるんですけど

trace ログ垂れ流しが許されるのは小学生までなので、きちんと制御したいですよね。
本当は、FlexSDK*1 へのオプションで出力するかどうかを制御できれば良いのですが、残念ながら制御できません。
なので、コードにちょっとだけ手を加えます。
また、今回はその制御を ant タスクで切り替える事ができるようにしようと思います。

基礎知識

まず、 trace を切り替える為に、コンパイル時の定数*2によって、切り分けます。
例えば、以下のように記載した場合

CONFIG::DEBUG {
    trace(message);
}

CONFIG::DEBUG 定数が true な場合のみ、trace 文が実行されるようになります。
これは、mxmlc のオプションにすると、以下のような指定になります。

# DEBUG モードの場合
mxmlc -define CONFIG::DEBUG true hoge.mxml

# リリースモードの場合
mxmlc -define CONFIG::DEBUG false hoge.mxml

これ、リリースモードだからといって CONFIG::DEBUG を省略するとコンパイルエラーになるので気をつけましょう。

ant タスクに応用するには

-define 部分を動的に(タスク毎に)変更できるようにしてあげれば良いということになりますね。
そこで、以下のような方針を取るようにしました。

  • 各プロジェクト単位の flex-config.xml に、 CONFIG::DEBUG false を記載しておく*3
  • ant の budeg-build タスクの場合は true にする

flex-config.xml の内容

<?xml version="1.0" encoding="UTF-8"?>
<flex-config>
    <target-player>10.0.0</target-player>
    <warnings>true</warnings>
    <compiler>
        <define>
            <name>CONFIG::DEBUG</name>
            <value>false</value>
        </define>
    </compiler>
</flex-config>

これで、デフォルト設定の既述が完了です。

ant タスク

ant タスクは全部載せてみた。
mxmlcの実行(debug)と書いてあるタスクの、 という部分がキモになります。

<?xml version="1.0" encoding="UTF-8"?>
<project name="flexAnt" default="build" basedir="./">
    <description>
        FlexAntを用いてFlexのコンパイルを行います
    </description>

    <!-- 環境によって変更されるパスの設定 -->
    <property name="FLEX_HOME" value="/opt/flex/flex_sdk_3.4.0.9271"/>
    <property name="PMD_VER" value="1.0.RC4"/>
    <property name="PMD_HOME" value="/opt/flex/flex-pmd-ant-task-${PMD_VER}"/>

    <!-- プロジェクトのベースディレクトリ定義 -->
    <dirname property="XML_DIR" file="${ant.file}"/>
    <property name="APP_ROOT" value="${XML_DIR}/../"/>
    <property name="APP_SRC" value="${APP_ROOT}/src"/>

    <!-- 各コマンドのパス設定 -->
    <property name="ASDOC_EXE" value="${FLEX_HOME}/bin/asdoc"/>

    <!-- 出力先ディレクトリの設定  -->
    <property name="BIN_OUTPUT" value="${APP_ROOT}/bin"/>
    <property name="ASDOC_OUTPUT" value="${APP_ROOT}/asdoc"/>
    <property name="PMD_OUTPUT" value="${APP_ROOT}/pmd"/>

    <!-- アプリケーションの名前 -->
    <property name="APP_NAME" value="APP_NAME"/>

    <!-- flex用Antタスクを読み込む -->
    <taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>

    <!-- FlexPMD タスクの定義 -->
    <taskdef name="flexPmd" classname="com.adobe.ac.pmd.ant.FlexPmdAntTask" >
        <classpath>
            <pathelement location="${PMD_HOME}/as3-parser-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/as3-parser-api-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/as3-plugin-utils-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/commons-lang-2.4.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-ant-task-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-core-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-files-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-command-line-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-ruleset-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-ruleset-api-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/plexus-utils-1.0.2.jar"/>
            <pathelement location="${PMD_HOME}/pmd-4.2.2.jar"/>
        </classpath>
    </taskdef>

    <!-- 全部入り動作 -->
    <target name="all" depends="clean,build,document,pmd" description="full build of project"/>

    <!-- 全部入り動作(debug)  -->
    <target name="debug-all" depends="clean,debug-build,document,pmd" description="full build of project"/>

    <!-- mxmlcの実行 -->
    <target name="build">
        <mkdir dir="${BIN_OUTPUT}" />
        <mxmlc file="${APP_SRC}/${APP_NAME}.mxml" output="${BIN_OUTPUT}/${APP_NAME}.swf">
            <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
            <load-config filename="${APP_ROOT}/build/${APP_NAME}.xml"/>
            <source-path path-element="${FLEX_HOME}/frameworks"/>
        </mxmlc>
    </target>

    <!-- mxmlcの実行(debug) -->
    <target name="debug-build">
        <mkdir dir="${BIN_OUTPUT}" />
        <mxmlc file="${APP_SRC}/${APP_NAME}.mxml" output="${BIN_OUTPUT}/${APP_NAME}.swf">
            <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
            <load-config filename="${APP_ROOT}/build/${APP_NAME}.xml"/>
            <define name="CONFIG::DEBUG" value="true" />
            <source-path path-element="${FLEX_HOME}/frameworks"/>
        </mxmlc>
    </target>

    <!-- cleanの実行 -->
    <target name="clean">
        <delete dir="${BIN_OUTPUT}" failOnError="false" includeEmptyDirs="true" />
        <delete dir="${ASDOC_OUTPUT}" failOnError="false" includeEmptyDirs="true" />
        <delete dir="${PMD_OUTPUT}" failOnError="false" includeEmptyDirs="true" />
    </target>

    <!-- asdocの実行 -->
    <target name="document">
        <mkdir dir="${ASDOC_OUTPUT}" />
        <exec executable="${ASDOC_EXE}" failOnError="false">
            <arg line='-source-path ${APP_SRC} ${FLEX_HOME}/frameworks/'/>
            <arg line='-doc-sources ${APP_SRC}'/>
            <arg line='-window-title "${APP_NAME}"'/>
            <arg line='-output ${ASDOC_OUTPUT}'/>
            <arg line='-compiler.define CONFIG::DEBUG true'/>
        </exec>
    </target>

    <!-- flex-pmd -->
    <target name="pmd">
        <mkdir dir="${PMD_OUTPUT}" />
        <flexPmd
            sourceDirectory="${APP_SRC}"
            outputDirectory="${PMD_OUTPUT}" />
    </target>
</project>

ここまですれば

ant タスクによって、trace ログの出力する/しないを制御できるようになります。
上記の例だと、

ant -f build.xml build

だと trace ログの出ないバイナリが生成され、

ant -f build.xml debug-build

だと trace ログが出るバイナリが生成されることになります。
あとは、 CONFIG::DEBUG {trace(hoge)} を、オレオレ Logger クラス等にして共通化させてあげると良いですね。

これであなたも

小学生から卒業です!><

*1:mxmlc

*2:このCONFIG::DEBUGというのはオレオレ定義なので、各自好きな定数にして良いです

*3:=デフォルトではリリースモード扱い