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 の内容
<?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 クラス等にして共通化させてあげると良いですね。
これであなたも
小学生から卒業です!><