アーカイブ

AIR 2.0 用ネイティブインストーラ生成 Ant 設定ファイル

Touch Viewer リリース後に作った副産物ですが、Win/Mac 両対応するように強化したので晒しておきます。

下記画像のような Flex プロジェクトのフォルダ構造を保っていれば、build.xml を実行するだけで、各 OS に対応した .exe や .dmg を書き出すことができます。

Flash Builder 4 β 2 で作成したサンプル Flex(AIR) プロジェクト

<?xml version="1.0" encoding="utf-8"?>
<!--
build.xml
-->
<project name="≪ プロジェクト名 ≫" basedir="." default="init">

   <condition property="os" value="≪ Flex SDK のフルパス (Windows) ≫">
       <os family="windows" />
   </condition>
   <condition property="os" value="≪ Flex SDK のフルパス (Mac) ≫">
       <os family="mac" />
   </condition>

   <condition property="suffix" value=".exe">
       <os family="windows" />
   </condition>
   <condition property="suffix" value=".dmg">
       <os family="mac" />
   </condition>

   <property name="FLEX_HOME"           value="${os}"                                  />
   <property name="ADT.JAR"             value="${FLEX_HOME}/lib/adt.jar"               />
   <property name="AIR_CONFIG"          value="${FLEX_HOME}/frameworks/air-config.xml" />
   <property name="FLEX_TASKS_JAR"      value="${FLEX_HOME}/ant/lib/flexTasks.jar"     />
   <property name="APP_ROOT_DIR"        value="src"                                    />
   <property name="ASSET_DIR"           value="asset"                                  />
   <property name="ICON_DIR"            value="${ASSET_DIR}/icon"                      />
   <property name="APP_NAME"            value="${ant.project.name}"                    />
   <property name="AIRI_NAME"           value="${APP_NAME}.airi"                       />
   <property name="DESCRIPTOR_NAME"     value="${APP_NAME}-app.xml"                    />
   <property name="NATIVE_APP_NAME"     value="${APP_NAME}${suffix}"                   />
   <property name="SWF_NAME"            value="${APP_NAME}.swf"                        />
   <property name="APP_ROOT_FILE"       value="${APP_ROOT_DIR}/${APP_NAME}.mxml"       />
   <property name="APP_ROOT_DESCRIPTOR" value="${APP_ROOT_DIR}/${APP_NAME}-app.xml"    />
   <property name="KEYSTORE"            value="≪デジタル証明書ファイル名≫.p12"       />
   <property name="STORETYPE"           value="pkcs12"                                 />
   <property name="STOREPASS"           value="≪デジタル証明書のパスワード≫"         />

   <taskdef resource="flexTasks.tasks" classpath="${FLEX_TASKS_JAR}" />

   <target name="resources">
       <copy
           file   = "${APP_ROOT_DESCRIPTOR}"
           tofile = "${APP_NAME}-app.xml"
        />
       <replaceregexp
           file    = "${APP_NAME}-app.xml"
           match   = "<content>.+?</content>"
           replace = "<content>${APP_NAME}.swf</content>"
        />
       <copy toDir="${ICON_DIR}">
           <fileset dir="${APP_ROOT_DIR}/${ICON_DIR}" />
       </copy>
   </target>

   <target name="amxmlc" depends="resources">
       <mxmlc
           file                       = "${APP_ROOT_FILE}"
           output                     = "${SWF_NAME}"
           configname                 = "air"
           actionscript-file-encoding = "UTF-8"
           incremental                = "true"
           debug                      = "false"
           optimize                   = "true"
           target-player              = "10"
       >
           <load-config filename="${AIR_CONFIG}" />
       </mxmlc>
   </target>

   <target name="prepare" depends="amxmlc">
       <java jar="${ADT.JAR}" fork="true" failonerror="true">
           <arg value = "-prepare"           />
           <arg value = "${AIRI_NAME}"       />
           <arg value = "${DESCRIPTOR_NAME}" />
           <arg value = "${SWF_NAME}"        />
           <arg value = "${ICON_DIR}"        />
       </java>
   </target>

   <target name="package" depends="prepare">
       <java jar="${ADT.JAR}" fork="true" failonerror="true">
           <arg value = "-package"           />
           <arg value = "-storetype"         />
           <arg value = "${STORETYPE}"       />
           <arg value = "-keystore"          />
           <arg value = "${KEYSTORE}"        />
           <arg value = "-storepass"         />
           <arg value = "${STOREPASS}"       />
           <arg value = "-target"            />
           <arg value = "native"             />
           <arg value = "${NATIVE_APP_NAME}" />
           <arg value = "${AIRI_NAME}"       />
       </java>
   </target>

   <target name="clean" depends="package">
       <delete dir  = "${ASSET_DIR}"       />
       <delete file = "${AIRI_NAME}"       />
       <delete file = "${SWF_NAME}"        />
       <delete file = "${SWF_NAME}.cache"  />
       <delete file = "${DESCRIPTOR_NAME}" />
   </target>

   <target name="init" depends="clean" />

</project>